0%

base

v2021.10-rc5

驱动相关

  1. Reset:Starfive-jh7110: Add reset driver for JH7110
    Support for reset controller on starfive JH7110 SoCs.
    commit: 56c86383dc88850ee2e5af197532939b861f573b

  2. GPIO:Starfive-jh7110: Add GPIO driver for JH7110
    Support for GPIO controller on starfive JH7110 SoCs.
    Commit: 53d9e9530ae20f804b7ca2766ab125b42ad5bdb3

  3. misc:OTP:Starfive-jh7110: Add driver for the Starfive otp controller
    Added a misc driver to handle OTP memory in Starfive SoCs.

没使用, 代码中用来读 eth0/1 MAC地址的, 但是没有启动

Commit: 4187fa6a2db9f82613758004fdab2b83b1161973

  1. clk:starfive-jh7110: Add clock driver for JH7110
    Add a clock driver for StarFive JH7110 Soc platform.
    Commit: e9cef6c8ce31ff51099f23e2d628483cf762d728

  2. reset:starfive: Adjust judgment conditions

The serial driver will call reset driver, udelay function will be called in reset driver,
but the timer is not init,so udelay function call will cases error.
Commit: c7889a100782db20e85f99f6471881cc51120dbc

  1. clk:starfive-jh7110: remove unused clk

Remove unused clock in order to reduce code size.
Commit: 90afdef187afbf0af192288118d0abf542bc6301

  1. clk:starfive-jh7110: Adjust the dependency of CLK_JH7110 & SPL_CLK_JH7110 macros

Adjust the dependency from TARGET_STARFIVE_VISIONFIVE to STARFIVE_JH7110.
Commit: 987a20bf9b0d146127559e0414c5d9607d41f601

  1. clk:starfive-jh7110: Update pll0/pll1/pll2 clk

Add JH7110_GMAC0_GTXC clk register and remove pll0/pll1/pll2 clk define
from clk-jh7110.c to jh7110_clk.dts
Commit: 76c3fe38884eabb095547ea5fd633855f221a2c5

  1. reset:starfive-jh7110: Adjust the dependency of RESET_JH7110 macro

Adjust the dependency from TARGET_STARFIVE_VISIONFIVE to
STARFIVE_JH7110.
Commit:

  1. GPIO:Starfive-jh7110: Add macro definition

Add macro definition of GPIO
Commit: cafd9e471a9e6d7dae0fc5549a94e11e2aea221b

  1. clk:starfive-jh7110: add JH7110_GMAC1_GTXC clk

Add JH7110_GMAC1_GTXC clk for GMAC1 on JH7110
Commit: 3b92ff69270562b86fba4e3e7f78f05ddc279ced

  1. clk:starfive-jh7110: Update pll0/pll1/pll2 clk

Remove pll0/pll1/pll2 clk define from jh7110_clk.dts to clk-jh7110.c
Commit: 0b2572d9978f265b51a218f334434ab9fde41552

  1. serial: ns16550: support a list of clk

Add a list of clk enable operation.
Commit: 98ef3602a1850c79d509fab405a673bf089e114e

  1. clk:riscv:starfive: update uart3-uart5 clks

Update uart3-uart5 clks register info for StarFive JH7110 SoC.
Commit: 4806c43e7adae907b72eaedeb635fa2c03eef196

  1. clk:jh7110: pll0 dynamically gets the frequency

pll0 dynamically gets the frequency.
Commit: d21940b4fcb226f80cec587794be4ca9e8c66a3f

  1. reset:starfive:jh7110: Delete redundant logic

In the hardware design, the IPs RESET signal of jh7110 is divided into
two groups,one group is active high, and the other group is active low.
Commit: b8c8323ddde327c1ca67c20cc179990d63b88212

  1. ram:starfive: Make ddr driver support 2G size

The ddr driver include two configs with 2G and 4G.Fist read the ddr size
config from the memory node in the dts,then match the right config and
do it.
Commit: b04743f040068be9b010bdb7acce67454c7bf8de

  1. ram: starfive: jh7110: Replace the configuration operation for pll1 clk

Replace the configuration operation for pll1 clk with common api provide
by pll module.

Commit: 6c18803bcb898acd1f983315e9063209ba1d13e8

  1. ram: starfive: Make DDR driver support 8G size

This patch include four items:
    1.rename the driver compatible name.
    2.reset action with the common API.
    3.clean up code to make it is closer to readable.
    4.add configuration to support 8G size
Commit: 10ee04a53553d97e698f36906844c243a1778b7f

  1. clk:jh7110: update apb_bus clk relationship

The previous definition of apb_bus clock relationship is incorrect,so
update it.
Commit: 20f3a9aeb57d6237a1a19ae519e23f06d98f88ef

  1. clk: starfive: jh7110: Modify the parameters of clk_register()

Modify the parameters pass to clk_register() for pll0/pll1/pll2 clk.
Commit: 0c1fefaf48d0f58453dedda58dcd6ac206d7970f

  1. driver:qspi: Switch the QSPI parent clock to pll0

Switch the QSPI parent clock to pll0 to improve the QSPI speed
Commit: bf2eae30d4aa6312e5a8578b12e8c3aa66a93fb0

  1. ram: starfive: remove fdtdec_setup_mem_size_base call

Memory information has been obtained elsewhere, so remove
fdtdec_setup_mem_size_base call.
Commit: d204f230ac075b82e4d59271369245b5c5e58ecf

  1. pinctrl: starfive: Add StarFive JH7110 driver

Add pinctrl driver for StarFive JH7110 SoC.
Commit: b69d2e5f56d1a2debb625bca32ac55df20a746ac

arch

  1. riscv:soc:jh7110: Add support jh7110 soc.

Add StarFive JH7110 soc to support RISC-V arch
Commit: ef888a4df1dd200a95e8eb7aa90d0b08b89a1964

  1. riscv:dts: add jh7110 support

Add dts support for jh7110. The starfive visionfive support is based on
jh7110 soc.
Commit: 632fd3126837ce40908de1b3c28d265e90367b71

  1. riscv:starfive-jh7110: clear L2 LIM memory

Clear L2 LIM memory on StarFive JH7110, avoid some unexpect exception.
Commit: 00018eb98a12f2ebbbd25fcca0d1262939ebc769

  1. arch: riscv: jh7110: add pll clk configuration for jh7110

Add common interface to set and get pll clk information for jh7110 soc.
Commit: 01bbc04d9d9c9e38e6dcc93b1e7dca57b5862c11

  1. arch: riscv: jh7110: read ram size from eeprom

Update memory size information, which read from eeprom.

通过 read_eeprom 接口读到 ram size.
Commit: eb119d1553cfbc3fbccba4b46bdfcd25a4abd54e

  1. riscv:starfive:jh7110: change gmac0 tx delay to 0xa

0xa will better match gmac0 tx in 1000M
Commit: 3d3363de0dd7b10d32f579031bbcc046adf4e7eb

board

  1. board:starfive: add starfive visionfive board support

Add board support for StarFive VisionFive.
Commit: d3c8386d64f99863213087335b14be84c378957d

  1. config:starfive-jh7110: add config file for jh7110

Add basic config option for StarFive VisionFive board.
Commit: e143a581a3cbdefd16771e9cc17cbd103c392a95

(x) 3. board:starfive: add rtc timer init (没使用 starfive_visionfive.c)

The rtc timer is used early in kernel, but the clk&reset driver is not
ready,so some clk&reset init is placed here.
Commit: f95a5cec9fd49737ce570098be96d0c4d5c40ea8

  1. board:starfive: add starfive evb board support

Add board support for StarFive EVB.
Commit: e81a6b4b7a58f56772b48db74ccadfc77a733fe1

  1. board:starfive: add clk init

Add clk init for ddr on JH7110 board
Commit: 0eddcac0de54ba6d7b73f4cef8fffc9ce86582e0

  1. config:starfive-jh7110: update starfive evb board default config

Add DDR config to the default config for starfive evb board.
Commit: 845221c93ff817e702beeb571946b988092591b3

  1. board:starfive: Modify dynamic alloc memory start addr in SPL

Modify the dynamic alloc memory start address from L2 LIM to DDR.
Commit: 41f9b1fe8d38ff8ab4f4e44aa953125834f9b41c

  1. board:starfive: enable prefetcher and add two macaddress configuration

Add two macaddress for gmac0 and gmac1. Enable prefetcher for EVB board.
Commit: fb8cb55de36782b2db2f85741758e67061d14355

  1. config:starfive-jh7110: add MICREL phy config to defconfig

Add MICREL phy config to defconfig for starfive EVB board.
Commit: 8a8168dd0c8404a6c3d72a924b7b4195c1cde8fb

  1. board:starfive:evb: modify the GPIO configuration for sd module

Modify the GPIO configuration for sd&emmc module, switch the clk of sd&emmc
to high frequency
Commit: 9ca1a627b4363ea3a08853cf1bbb821291ea0710

  1. board:starfive:evb: update uart3-uart5 resets

Add SPL_DM_RESET to defconfig, and update uart3-uart5 reset for StarFive
JH7110 SoC.

Commit: 61f294b11cd12981b93a3a2deb8036f705332ae2

  1. config:starfive-jh7110: add sd card boot config

Configure SD card boot parameters
Commit: 810b30254ca077d2f83ade0e30c51f60e9751945

  1. configs: starfive_evb_defconfig: Support saveenv

Add saveenv config to Support saveenv

  1. configs: starfive_visionfive2_defconfig: Support saveenv

Add saveenv config to Support saveenv
Commit: 6a74373a2368794cc52907ad9c77694cab6612be

  1. configs: starfive: fix tftpboot file waite a long time for the first time

ARP_TIMEOUT is too large, then will waite a long time for the first time
Set ARP_TIMEOUT to 500 refer to others
Set PHY_ANEG_TIMEOUT needs longer aneg time for the 2nd phy
Commit: 5ae5eca975735a24fa04c00ec83f8cdbb408278e

  1. board:starfive:evb: add jh7110_gmac_sel_tx_to_rgmii

JH7110B needs switch gmac0/1 tx to rgmii phy.
Commit: bd7deb0588459f36cf774ed58a419a7efbc9d5e4

  1. board:starfive:evb: add get_chip_type

Read the chip model from the rgpio3 and setenv “chip_vision”
Commit: 0dbe3fb0be546f2be7adaee6baf6d550fbba4e26

  1. board:starfive:evb: Support using env to detect board version

JH7110B need tx_inverted by YT8521 phy, you need to read the chip
version to determine whether to use it.
Commit: ca91f535d48d02088ed4b5ad78eb343c0325b8c9

  1. board: starfive: Support visionfive2
    Commit: ad9e1dc0ba91125117eb8d2a8474048c9632c530

  2. board: starfive: visionfive: Add uart0 and jtag pinmux
    Commit: e67867c5f8062448479b6ae647aa6cfaab6134da

  3. Support sd autoboot
    Commit: 59f872828b12d93b2636f2292bf0d7b2fa7088c5

  4. board: starfive: Add i2c5 init for VisionFive2
    Commit: 642566351597bc9eca648de6ecdc6fed2a99e509

  5. add ID_EEPROM supoort for VisionFive2
    Commit: 5f51c4024944bcd13211dd699cb89d3ea903e987

  6. board: starfive: update gpio index base on visionfive2 A1.1

update sdio emmc uart0 gpio index base on visionfive2 new board A1.1
Commit: ef6e2f4194fc6d4cdb90cde3d9aad0feaf85847c

  1. config: jh7110: read uboot by partition

uboot should be placed in partition-2
Commit: a4c05f0a0f3f67aeefe8c853f329dcd1981d39ec

  1. Support scan to boot from sd card or emmc

Get bootmode, if bootmode is flash, then default boot from sd card.
Commit: 62abf7817bc66ed679534d75d904b029713cade3

  1. Support boot from grub
    Commit: d4566c2f24b4df5702bb1ddf22f7d4b122f31280

  2. board: starfive: Support auto to init gmac base on eeprom data
    Commit: 7e0268be6a6cd721230ea549e20588999170e37b

  3. board: starfive: Add interface to get data from eeprom
    Commit: a25a1eb135b59a0a9050156831dc2bb6f735f063

  4. board: starfive: visionfive2: add memory_addr and memory_size environment variable

In order to compatible visionfive2 board with different version,so the
memory size information read from eeprom. and save to environment
variable. The value which saved in environment variable will be used
to update the memory node in dts.
Commit: d4cfd564c23afae9efeb44a12d6a2be50b17d912

  1. board:starfive:visionfive2: add jh7110_gmac_sel_tx_to_rgmii

JH7110B needs switch gmac0/1 tx to rgmii phy.
Commit: d4b261737e038bdf1bd234c776b9d864fdff5ebe

  1. board:starfive:visionfive2: add get_chip_type

Read the chip model from the eerpom and setenv “chip_vision”
Commit: 48c7e4f1d064eb4f7b9493eda70897778a4e115f

  1. board:starfive:visionfive2: Modify jh7110_gmac_init

JH7110B(chip_vision B) need switch gmac tx clk to rgmii phy.
Commit: b249d3bac3ab7524e2c066afdf1fef59d63dad5b

  1. board:starfive:visionfive2: setenv uboot_fdt_addr

It is more convenient to dynamically modify uboot dts
Commit: 2a54b81bcaf7486aa8f75c04b67fcd809ca3dfa2

  1. board:starfive:visionfive2: Support using env to detect board version

JH7110A do not need tx_inverted by YT8531 phy, you need to read the chip
version to determine whether to use it.
Commit: d0df544ccec590d8c18ebb9e63a36066af878dd5

  1. board:starfive:visionfive2: Adaptive mem size in linux.

Visionfive2 has a 2/4/8G version. You need to read eeprom information in
uboot to obtain the size of mem, and modify the size of mem in linux
dts.
Commit: bcebb15d3a72480fd3871d9c3c597a4f249332d5

  1. riscv:starfive:jh7110: change gmac0 tx delay to 0x9 for 1.2A.

0x9 will better match 1.2A gmac0 tx in 1000M
Commit: 6c8ec6a1fc2f14b756fb586c44ac4d8928a6ae82

  1. qspi: improve qspi speed
    Commit: c42307e5639f9a6e7be41b2c504a7a635666397a

  2. efi_loader: Enable RISCV_EFI_BOOT_PROTOCOL support

This adds support for new RISCV_EFI_BOOT_PROTOCOL to
communicate the boot hart ID to bootloader/kernel on RISC-V
UEFI platforms.
Commit: d2dc8ab69ef123955443fe63a58484f63e2c2d8b

  1. configs:Enable CONFIG_CMD_NVEDIT_EFI and CONFIG_CMD_EFIDEBUG

Enable CONFIG_CMD_NVEDIT_EFI, CONFIG_CMD_EFIDEBUG, CONFIG_HEXDUMP and CONFIG_EFI_RISCV_BOOT_PROTOCOL.
Commit: dd3d4040c3a8e6ddf9a7d288145aaa6819fd1672

  1. borad:jh7110:vf2: Modify ramdisk_addr_r/pxefile_addr_r/scriptaddr

The jh7110 ddr starts from 0x40000000. Using 0x80000000 may cause the
CMA space to fail
Commit: bafe822cd4a4ffb82945e15a82a504010cb4c5af
Commit: c6a5bf91e2caf9f463a92a9198d8240a55caf8e8

  1. board:starfive:Add gpio init
    board:starfive:Add gpio init

Fixing don’t detect wm8960 occasionally
Set scl/sda gpio output enable
Set drive strength to 12mA
Set gpio pull up
Commit: 226b62f65ea56d7946864140582885f0a5027a07

  1. board:starfive:Modify GPIO_SD_SHIFT to GPIO_DS_SHIFT
    Modify GPIO_SD_SHIFT to GPIO_DS_SHIFT.
    Fix jh7110_gpio_init function.
    Commit: fb41a409823d96ef4b7db791764ece91ec407f7c

  2. dt-bindings: pinctrl: Add StarFive JH7110 pinctrl definitions

Add pinctrl definitions for StarFive JH7110 SoC.
Commit: 1288948b5409bd39fc90a6ff33b9e965518a7838

  1. configs: Enable STARFIVE_PINCTRL

Enable STARFIVE_PINCTRL and PINCTRL_FULL
Commit: ee772d8aea46ebd0501a1acf3650da4bb68a897b

  1. board:starfive:Remove usb/sdio0/sdio1 gpio init

Remove usb/sdio0/sdio1 gpio init.
Commit: 4cc82557a555cc4b99d0d5322122f7af3d798e59

  1. configs: visionfive2 Enable STARFIVE_PINCTRL

visionfive2 Enable STARFIVE_PINCTRL and PINCTRL_FULL
Commit: 155942dbba0aa27065a12f76d71852bb6ba03943

  1. dts:starfive:Visionfive2 Add pinctrl config

Add pinctrl config about sdio0/sdio1/uart0
Commit: 95589281b9c98534c26e339f8780b739c38b0d63

  1. board:starfive:jh7110: default cpufreq is 1000Mhz.

The frequency of pll0 is set to 1000Mhz in the bootrom
Commit: 9b71c6f5fa0d96680a3329e24afab8b09ad685fb

  1. board:starfive:jh7110: Set the CPU default frequency to 1000MHz

Set to 1000M to ensure the CPU can work normally under 0.8V`
voltage
Commit: 699c0a80340c59f6c68253966b0914cefd89baa2

  1. board:starfive:visionfive2: configure vf2 for sysboot method

Dynamically edit dtb to load correct hardware information and uses sysboot method to boot to distro
Commit: dededaf458b8e38243ce8e8508d959621c56b985

net

  1. net:phy: add 10/100M register configuration

Support 10/100M configuration.
Commit: dffb8ea8dd2860bb06e173e9f48f3f14b3b606f7

  1. net: dwc_eth_qos:starfive: add jh7110 support

Add new configuration for jh7110 soc platform.
Commit: 461cd1afbed484002536e4f6cf985d47c33b09e8

  1. net:phy:YUTAI: Add YT8511/yt8521 phy driver

This adds basic support for YUTAI YT8511/YT8521 phy.
Commit: 66ede3957c034d69fbbc24d22c19701c68b42cbf

  1. net:phy:YUTAI: Add YT8511/yt8521 phy init

Add phy init for YUTAI YT8511/YT8521.
Commit: 17a76df9975a5cf1dfad3cd02c9fd7aa49471001

  1. net:phy:YUTAI: Add delay chain

Add tx/rx delay chain for YUTAI 8521
Commit: f785501c47181e5918e8464edfedfee3a1c43566

  1. net: dwc_eth_qos:starfive: update clk init

Modify the clk init code for StarFive JH7110 platform.
Commit: db61964dc2ecbbc9fb7fb89f0eed597b4429c82f

  1. net:dwc_eth_qos:starfive: remove phy-reset-gpio set

Phy-reset-gpio set is unused in JH7110
Commit: 87549bf09316b49ec19e7e9c289d6138deb3de1c

  1. riscv:dts:starfive-jh7110: add ethernet-phy delay_chain config

Add ethernet-phy delay_chain configuration for gmac1 on starfive EVB
board.

Commit: 6bf1de16aa64caef1f8fab2876fa83a6f12f0917

  1. net:phy:YUTAI: change tx delay config

Modify the tx delay configuration.
Commit: b239f16521b95137a46d6bfb59d8214da3f0620b

  1. net:phy:motorcomm: Support modifying RGMII_TX_CLK delay train from dts

support use original or inverted RGMII_TX_CLK delay train.
10M/100M/1000M can be configured independently.
Commit: fe0ba7e18ed6fddfa4fe22e93cb1827d7a73a7a7

  1. net: phy: Support YT8531 Gigabit Ethernet
    Commit: b8632bd416725e28894ef5bb8b4ede92d4f5bfd4

  2. net:stmmac:dwc-qos: add support for external rmii_rtx clocks

JH7110A use external rmii_rtx clk for tx clk on 100M/10M mode.
Commit: 1cbbd9f9decb9815b29a77e42db7a0792c239883

usb

  1. usb:cdns3:Add StarFive wrapper driver for CDNS USB3 controller

Add driver to handle StarFive specific wrapper for Cadence USB3 controller
present on JH7110 SoC.
Commit: 11477926e35cb478977edd67181f6b16ce5a1afc

  1. board:starfive:evb: add usb init config

Add usb init config for starfive EVB board. Default set to USB2.0
Commit: 5531f12c6efc79817914bf96f5b755840402e8c7

dts

  1. riscv:dts: update clk&reset properties

Synchronize the kernel dts file
Commit: a014f51a8627f564caaa57654a56919972851c90

  1. riscv:dts: update clk&reset properties

Synchronize the kernel dts file
Commit: becd46e20807c56a071be1eaab897bcaeb178c31

  1. riscv:dts:starfive-jh7110: add ddr device node

Add ddr device node for JH7110.
Commit: 6f0b30d82cebe9457d42f442846b716fcca65beb

  1. riscv:dts:starfive-jh7110: Modify sd node configuration

Modify SD&EMMC node configuration on Starfive EVB board.
Commit: 967e3296edfa01d8109213f5dd89b7bc9e6c1801

  1. riscv:dts:starfive-jh7110: modify Model and riscv,isa info

Change Model to “StarFive JH7110 EVB”, and change riscv,isa to
“rv64imafdcbsux”
Commit: 283a338dce45e9db43e9c7a40eaf56482f5d8d3a

  1. riscv: dts: jh7110: Add reset property to DDR control node

Add reset property configuration to DDR control device tree node.
Commit: 7efb109f1dd2f9a34da35392338ba3290764ec5c

  1. dts:starfive:jh7110: set gmac phy tx_inverted for JH7110A/B.

JH7110B requires tx_inverted_10/100/1000 configuration, and different
parameters
may be required in 10M/100M/1000M mode.

This parameter supports JH7110B+YT8531PHY by default. Other boards can
modify the parameters of the tx_inverted_10/100/1000 to obtain support.

If you do not configure tx_inverted_10/100/1000 in dts, the default is 0.
Commit: 460fe5dd0b3a288eb58bee6874683288bef671ce

  1. riscv:dts:starfive-visionfive2: Add ethernet-phy node to set delay_chain
    configuration

Add ethernet-phy subnode to gmac node, so the delay_chain configuration
is passed through the ethernet-phy node.
Commit: c0f7ad1b409cbae54b2d0272d57e4ee55e9917ec

  1. dts:starfive:jh7110: set gmac phy tx_inverted for JH7110B+YT8531PHY.

JH7110B requires tx_inverted_10/100/1000 configuration, and different parameters
may be required in 10M/100M/1000M mode.

Commit: a953d55d4b0ad37af2b1f2e673813e08ec999df6

  1. dts: pmic: add axp15060 pmic config in vf2 uboot dts

add axp15060 pmic dts config for opensbi power managment
used.
Commit: b50de2c0ae0c5e6e1e52853960d232005ddb17db

  1. dts:starfive:Add pinctrl config

Add pinctrl config about usb/sdio0
Commit: 68dc79062721456f05815278dd428c2355ebd132

arch/riscv/dts/jh7110-u-boot.dtsi
arch/riscv/dts/jh7110.dtsi
arch/riscv/dts/jh7110_clk.dtsi
arch/riscv/dts/starfive_visionfive-u-boot.dtsi
arch/riscv/dts/starfive_visionfive.dts

spl

  1. ram:starfive: add ddr driver

Add driver for JH7110 to support ddr initialization in SPL.
Commit: b8ceeb8238c4db755c2a3e5fe178568bd2d4c568

  1. SPL:riscv:starfive-jh7110: Adjust CPU working frequency

Adjust CPU working frequency from 1G to 1.25G for starfive EVB board.
Commit: c43d28132317bd745a485543569e80d4bcfee018

  1. spl:gpio: Set GPIO domain0-3 voltage to 1.8V

The default GPIO domian0-3 voltage is 3.3V, which is controlled by 4
bits. 0 means 3.3.V, 1 means 1.8V.
Commit: fc05902d00e58c4c85a34d8ab44dc42eef51cdc6

  1. spl: satrfive: bus_root switch to pll2.

High-speed emmc/sdio support
Commit: 1f6321dbaf5951fd0ffce1bf320000c8be9280f6

  1. SPL:starfive-jh7110: Modify the default division factor of sdcard clk

Modify the default division factor of sdcard clk to 4.
Commit: 16178e355d396994e63546d552a5c75e4aad71c0

  1. SPL:reset:starfive-jh7110: support reset in SPL

Update Kconfig to support reset in SPL for StarFive JH7110 SoC.
Commit: abd35ca6d33fb5df1f413b5466b315a92fa36f4f

  1. spl:starfive: remove function spl_cpu_fre_150/125

replace them with spl_cpu_set_rate.
Commit: 90a8248c00836a25ddc3e3bca3a83f41f61a4cd3

  1. spl:starfive: Add support for different CPU frequencies.

The cpu uses 1.25G by default.
Commit: 66107c3e05e8804971bd14c575a509dbd816ae37

  1. spl:jh7110: Modify cpu frequency should be before switching pll
    Commit: 0fb1b1ba8184d410749a657c932a4bb7f107a8d2

  2. spl: starfive: jh7110: switch pll2 to 1188M

Switch the pll2 clk to 1188M with the comm pll interface on JH7110.
Commit: 47e689908a5cca249c036138cc0f4bde014576a2

  1. spl:starfive:jh7110: Improved GMAC0/1 TX I/O PAD capability

JH7110B requires a higher IOPAD capability in 1000M mode.
Commit: 945a1c00275fa1e81678dfa54d430f0877cd8146

  1. i2c: designware: support SYS_I2C_DW in SPL

Add SYS_I2C_DW driver to support in SPL.
Commit: a98d92b150695ab214bb119a9afc07d38d136a1f

  1. SPL: starfive: jh7110: add i2c init in SPL

Add basic init before used by other modules in SPL.
Commit: 0cb0bb697c65553464dc1b20f656da56281942db

  1. riscv: dts: starfive: add i2c5 node in SPL

Add i2c5 device configuration to device tree which used by SPL.
Commit: 352b4397d389e41f1d170c43a9b9139a8fbb79f2

  1. configs: starfive: visionfive2: enable i2c eeprom in SPL

Enable I2C and EEPROM driver in SPL.

drivers/misc/i2c_eeprom.c

1
2
3
4
5
eeprom@50 {
compatible = "atmel,24c04";
reg = <0x50>;
pagesize = <0x10>;
};

Commit: e7083b7199dba53255c4b59ee55f767e071133af

  1. spl:starfive:jh7110: Improved GMAC0 TX I/O PAD capability

JH7110B requires a higher IOPAD capability in 1000M mode.
Commit: b949c9b66c4d453ed0d454c7b5ee5c0aea280c28
Commit: 9b8509bfef25819f9be0015013370aec69f6ba5b

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
/ {
compatible = "starfive,jh7110";
#address-cells = <0x2>;
#size-cells = <0x2>;
model = "StarFive VisionFive V2";

osc {
compatible = "fixed-clock";
#clock-cells = <0x0>;
clock-frequency = <0x16e3600>;
phandle = <0x8>;
};

gmac1_rmii_refin {
compatible = "fixed-clock";
#clock-cells = <0x0>;
clock-frequency = <0x2faf080>;
phandle = <0x9>;
};

stg_apb {
compatible = "fixed-clock";
#clock-cells = <0x0>;
clock-frequency = <0x30d4000>;
phandle = <0xa>;
};

gmac0_rmii_refin {
compatible = "fixed-clock";
#clock-cells = <0x0>;
clock-frequency = <0x2faf080>;
phandle = <0xb>;
};

cpus {
#address-cells = <0x1>;
#size-cells = <0x0>;
timebase-frequency = <0x3d0900>;
phandle = <0x2c>;

cpu@0 {
compatible = "sifive,u74-mc", "riscv";
reg = <0x0>;
d-cache-block-size = <0x40>;
d-cache-sets = <0x40>;
d-cache-size = <0x2000>;
d-tlb-sets = <0x1>;
d-tlb-size = <0x28>;
device_type = "cpu";
i-cache-block-size = <0x40>;
i-cache-sets = <0x40>;
i-cache-size = <0x4000>;
i-tlb-sets = <0x1>;
i-tlb-size = <0x28>;
mmu-type = "riscv,sv39";
next-level-cache = <0x1>;
riscv,isa = "rv64imacu";
tlb-split;
status = "okay";
phandle = <0x2d>;

interrupt-controller {
#interrupt-cells = <0x1>;
compatible = "riscv,cpu-intc";
interrupt-controller;
phandle = <0x3>;
};
};

cpu@1 {
compatible = "sifive,u74-mc", "riscv";
reg = <0x1>;
d-cache-block-size = <0x40>;
d-cache-sets = <0x40>;
d-cache-size = <0x8000>;
d-tlb-sets = <0x1>;
d-tlb-size = <0x28>;
device_type = "cpu";
i-cache-block-size = <0x40>;
i-cache-sets = <0x40>;
i-cache-size = <0x8000>;
i-tlb-sets = <0x1>;
i-tlb-size = <0x28>;
mmu-type = "riscv,sv39";
next-level-cache = <0x1>;
riscv,isa = "rv64imafdcbsux";
tlb-split;
status = "okay";
phandle = <0x2e>;

interrupt-controller {
#interrupt-cells = <0x1>;
compatible = "riscv,cpu-intc";
interrupt-controller;
phandle = <0x4>;
};
};

cpu@2 {
compatible = "sifive,u74-mc", "riscv";
reg = <0x2>;
d-cache-block-size = <0x40>;
d-cache-sets = <0x40>;
d-cache-size = <0x8000>;
d-tlb-sets = <0x1>;
d-tlb-size = <0x28>;
device_type = "cpu";
i-cache-block-size = <0x40>;
i-cache-sets = <0x40>;
i-cache-size = <0x8000>;
i-tlb-sets = <0x1>;
i-tlb-size = <0x28>;
mmu-type = "riscv,sv39";
next-level-cache = <0x1>;
riscv,isa = "rv64imafdcbsux";
tlb-split;
status = "okay";
phandle = <0x2f>;

interrupt-controller {
#interrupt-cells = <0x1>;
compatible = "riscv,cpu-intc";
interrupt-controller;
phandle = <0x5>;
};
};

cpu@3 {
compatible = "sifive,u74-mc", "riscv";
reg = <0x3>;
d-cache-block-size = <0x40>;
d-cache-sets = <0x40>;
d-cache-size = <0x8000>;
d-tlb-sets = <0x1>;
d-tlb-size = <0x28>;
device_type = "cpu";
i-cache-block-size = <0x40>;
i-cache-sets = <0x40>;
i-cache-size = <0x8000>;
i-tlb-sets = <0x1>;
i-tlb-size = <0x28>;
mmu-type = "riscv,sv39";
next-level-cache = <0x1>;
riscv,isa = "rv64imafdcbsux";
tlb-split;
status = "okay";
phandle = <0x30>;

interrupt-controller {
#interrupt-cells = <0x1>;
compatible = "riscv,cpu-intc";
interrupt-controller;
phandle = <0x6>;
};
};

cpu@4 {
compatible = "sifive,u74-mc", "riscv";
reg = <0x4>;
d-cache-block-size = <0x40>;
d-cache-sets = <0x40>;
d-cache-size = <0x8000>;
d-tlb-sets = <0x1>;
d-tlb-size = <0x28>;
device_type = "cpu";
i-cache-block-size = <0x40>;
i-cache-sets = <0x40>;
i-cache-size = <0x8000>;
i-tlb-sets = <0x1>;
i-tlb-size = <0x28>;
mmu-type = "riscv,sv39";
next-level-cache = <0x1>;
riscv,isa = "rv64imafdcbsux";
tlb-split;
status = "okay";
phandle = <0x31>;

interrupt-controller {
#interrupt-cells = <0x1>;
compatible = "riscv,cpu-intc";
interrupt-controller;
phandle = <0x7>;
};
};
};

soc {
compatible = "simple-bus";
#address-cells = <0x2>;
#size-cells = <0x2>;
#clock-cells = <0x1>;
ranges;
phandle = <0x32>;

clint@2000000 {
compatible = "riscv,clint0";
reg = <0x0 0x2000000 0x0 0x10000>;
reg-names = "control";
interrupts-extended = <0x3 0x3 0x3 0x7 0x4 0x3 0x4 0x7 0x5 0x3 0x5 0x7 0x6 0x3 0x6 0x7 0x7 0x3 0x7 0x7>;
#interrupt-cells = <0x1>;
phandle = <0x34>;
};

clock-controller {
compatible = "starfive,jh7110-clkgen";
reg = <0x0 0x13020000 0x0 0x10000 0x0 0x10230000 0x0 0x10000 0x0 0x17000000 0x0 0x10000>;
reg-names = "sys", "stg", "aon";
clocks = <0x8 0x9 0xa 0xb>;
clock-names = "osc", "gmac1_rmii_refin", "stg_apb", "gmac0_rmii_refin";
#clock-cells = <0x1>;
status = "okay";
phandle = <0xf>;
};

spi@13010000 {
compatible = "cdns,qspi-nor";
#address-cells = <0x1>;
#size-cells = <0x0>;
reg = <0x0 0x13010000 0x0 0x10000 0x0 0x21000000 0x0 0x400000>;
clocks = <0xf 0x5a>;
clock-names = "clk_ref";
resets = <0x10 0x3e 0x10 0x3d 0x10 0x3f>;
resets-names = "rst_apb", "rst_ahb", "rst_ref";
cdns,fifo-depth = <0x100>;
cdns,fifo-width = <0x4>;
spi-max-frequency = <0xee6b280>;
status = "okay";
phandle = <0x35>;

nor-flash@0 {
compatible = "jedec,spi-nor";
reg = <0x0>;
spi-max-frequency = <0x5f5e100>;
cdns,tshsl-ns = <0x1>;
cdns,tsd2d-ns = <0x1>;
cdns,tchsh-ns = <0x1>;
cdns,tslch-ns = <0x1>;
phandle = <0x36>;
};
};

serial@10000000 {
compatible = "snps,dw-apb-uart";
reg = <0x0 0x10000000 0x0 0x10000>;
reg-io-width = <0x4>;
reg-shift = <0x2>;
clocks = <0xf 0x92 0xf 0x91>;
clock-names = "baudclk", "apb_pclk";
resets = <0x10 0x53 0x10 0x54>;
status = "okay";
reg-offset = <0x0>;
current-speed = <0x1c200>;
clock-frequency = <0x16e3600>;
phandle = <0x3e>;
};

i2c@12050000 {
compatible = "snps,designware-i2c";
reg = <0x0 0x12050000 0x0 0x10000>;
clocks = <0xf 0x12a 0xf 0x8f>;
clock-names = "ref", "pclk";
resets = <0x10 0x51>;
#address-cells = <0x1>;
#size-cells = <0x0>;
status = "okay";
clock-frequency = <0x186a0>;
i2c-sda-hold-time-ns = <0x12c>;
i2c-sda-falling-time-ns = <0xbb8>;
i2c-scl-falling-time-ns = <0xbb8>;
auto_calc_scl_lhcnt;
phandle = <0x4b>;

eeprom@50 {
compatible = "atmel,24c04";
reg = <0x50>;
pagesize = <0x10>;
};
};

sdio0@16010000 {
compatible = "snps,dw-mshc";
reg = <0x0 0x16010000 0x0 0x10000>;
clocks = <0xf 0x5b 0xf 0x5d>;
clock-names = "biu", "ciu";
resets = <0x10 0x40>;
reset-names = "reset";
fifo-depth = <0x20>;
bus-width = <0x8>;
status = "okay";
phandle = <0x4d>;
};

sdio1@16020000 {
compatible = "snps,dw-mshc";
reg = <0x0 0x16020000 0x0 0x10000>;
clocks = <0xf 0x5c 0xf 0x5e>;
clock-names = "biu", "ciu";
resets = <0x10 0x41>;
reset-names = "reset";
fifo-depth = <0x20>;
bus-width = <0x4>;
status = "okay";
phandle = <0x4e>;
};

reset-controller {
compatible = "starfive,jh7110-reset";
reg = <0x0 0x13020000 0x0 0x10000 0x0 0x10230000 0x0 0x10000 0x0 0x17000000 0x0 0x10000 0x0 0x19810000 0x0 0x10000 0x0 0x295c0000 0x0 0x10000>;
reg-names = "syscrg", "stgcrg", "aoncrg", "ispcrg", "voutcrg";
#reset-cells = <0x1>;
status = "okay";
phandle = <0x10>;
};

dmc@100b0000 {
compatible = "starfive,jh7110-dmc";
reg = <0x0 0x15700000 0x0 0x10000 0x0 0x13000000 0x0 0x10000>;
resets = <0x10 0x26 0x10 0x27 0x10 0x28>;
reset-names = "axi", "osc", "apb";
clock-frequency = <0x855>;
phandle = <0x71>;
};
};

aliases {
spi0 = "/soc/spi@13010000";
mmc0 = "/soc/sdio0@16010000";
mmc1 = "/soc/sdio1@16020000";
i2c0 = "/soc/i2c@12050000";
};

chosen {
stdout-path = "/soc/serial@10000000:115200";
};

memory@80000000 {
device_type = "memory";
reg = <0x0 0x40000000 0x1 0x0>;
};

firmware {
spi0 = "/soc/qspi@11860000";
};

config {
u-boot,spl-payload-offset = <0x100000>;
};
};

u-boot 中evb 相关的组件

  1. pinctrl 相关
    drivers/pinctrl/starfive/*
    pinmux 等 gpio_set_value
    Figure 3-1 Pin Map 040

  2. dram 相关
    arch/riscv/cpu/jh7110/dram.c
    只是获取大小, 基址等
    没有进行ddr 初始化, 不涉及 drivers/ram/starfive/ 下的代码

  3. clk 相关 pll
    drivers/clk/starfive/clk-jh7110.c
    dts “starfive,jh7110-clkgen”
    reg : aon sys stg

  4. gpio
    drivers/gpio/starfive-gpio.c
    GPIO Function Description 055
    Full Multiplexing 060

  5. eeprom
    board/starfive/visionfive2/visionfive2-i2c-eeprom.c
    设置board相关信息, 如 mac0_address mac1_address pcb_revision product_id 等

  6. arch 相关
    arch/riscv/cpu/jh7110/
    主要是pll

  7. 复位相关
    drivers/reset/reset-jh7110.c

Table 5-4 Reset Source 071

  1. net usb 相关
    drivers/usb/cdns3/cdns3-starfive.c (新增 cdns usb3 controller 驱动)
    drivers/net/phy/motorcomm.c (新增 net:phy:YUTAI 驱动 Add YT8511/yt8521 phy driver)
    drivers/net/dwc_eth_qos.c :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static struct eqos_ops eqos_jh7110_ops = {
.eqos_inval_desc = eqos_inval_desc_generic,
.eqos_flush_desc = eqos_flush_desc_generic,
.eqos_inval_buffer = eqos_inval_buffer_generic,
.eqos_flush_buffer = eqos_flush_buffer_generic,
.eqos_probe_resources = eqos_probe_resources_jh7110,
.eqos_remove_resources = eqos_remove_resources_jh7110,
.eqos_stop_resets = eqos_stop_resets_jh7110,
.eqos_start_resets = eqos_start_resets_jh7110,
.eqos_stop_clks = eqos_stop_clks_jh7110,
.eqos_start_clks = eqos_start_clks_jh7110,
.eqos_calibrate_pads = eqos_null_ops,
.eqos_disable_calibration = eqos_null_ops,
.eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_jh7110,
.eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_jh7110
};

struct eqos_config __maybe_unused eqos_jh7110_config = {
.reg_access_always_ok = false,
.mdio_wait = 10,
.swr_wait = 50,
.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB,
.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300,
.axi_bus_width = EQOS_AXI_WIDTH_64,
.interface = eqos_get_interface_jh7110,
.ops = &eqos_jh7110_ops
};
  1. board 相关
    board/starfive/evb/starfive_visionfive2.c
    board_init_r
    enable_caches();
    enable_prefetcher();
    jh7110_jtag_init();
    jh7110_timer_init();
    jh7110_usb_init(true);
    jh7110_i2c_init(5);
    jh7110_gpio_init();
    misc_init_r
    set_uboot_fdt_addr_env
    board_late_init
    get_boot_mode();
    jh7110_gmac_init(get_chip_type(), get_board_type());
    env_set_hex(“memory_addr”, gd->ram_base);
    env_set_hex(“memory_size”, gd->ram_size);

  2. 启动相关
    include/configs/starfive-visionfive2.h
    VF2_DISTRO_BOOTENV env相关配置如 kernel_addr_r 等
    “bootcmd=” CONFIG_BOOTCOMMAND

  3. cache相关
    drivers/cache/cache-sifive-ccache.c
    arch/riscv/lib/cache.c
    arch/riscv/lib/sifive_cache.c

spl中evb 相关组件

  1. pll 相关修改
    arch/riscv/cpu/jh7110/pll.c
    arch/riscv/cpu/jh7110/spl.c

PLL0 PLL1 PLL2
Figure 5-2 Clock Structure 073

  1. dram相关初始化
    arch/riscv/cpu/jh7110/dram.c
    drivers/ram/starfive/*
    ddr_phy ddrcsr_boot ddr_csr_cfg/ddr_csr_cfg1/ddr_csr_cfg2/ddr_csr_cfg3 dddrc_clock (controller 配置)

board/starfive/evb/spl.c

spl 中没有使用pinctrl

  1. 复位相关
    drivers/reset/reset-jh7110.c
    如ddr 初始化时会用到 rst_osc rst_apb rst_axi

  2. cpu相关
    arch/riscv/lib/sifive_clint.c
    arch/riscv/lib/cache.c
    arch/riscv/lib/interrupts.c
    arch/riscv/lib/smp.c
    ? drivers/timer/riscv_timer.c
    drivers/timer/sifive_clint_timer.c

==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

%%

Drawing

1
{"type":"excalidraw","version":2,"source":"https://excalidraw.com","elements":[],"appState":{"theme":"dark","gridSize":null,"viewBackgroundColor":"#ffffff"}}

%%

Configuration

属性 L1 ICache L1 DCache L2 Cache
Size 32KB or 64KB 32KB or 64KB 256KB, 512KB, 1MB, 2MB, 4MB or 8MB
Line Size 64-byte 64-byte 64-byte
Cache Sets 128 or 256 128 or 256 512, 1024, 2048 4096, 8192
Associativity 4-way 4-way 8-way (256KB only) 16-way (all others)
Type VIPT VIPT

L2 Cache 集成在 CM 中,与外部 memory 通过256-bit AXI 接口连接

L1 cache 配置

l1 cache 配置

注意:

l1-dcache 和 l1-icache 均不支持 “Fetch and Lock”, mcache 对 icache 和 l1-dcache 执行 Fecth and lock 操作相当于执行 nop.
由于不支持 lock, 所以不用对 tag 进行初始化? 只需要执行 MGINVI 或 FENCE.I 将 icache dcache invalidate 即可.

在 mipsconfig1 csr 中包含了 l1 cache 的配置

  • L2C  见下面的 GCR_L2_CONFIG 寄存器
  • IS 只读, I-cache set 数, set = 2^(IS+6) if IS 不为 7, 如果IS=7, set=32
  • IL 只读, I-cache line size, line_size = 2^(IL+1)
  • IA 只读, I-cache way , way = IA + 1
  • DS 只读, D-cache set 数,  set = 2^(DS+6) if DS 不为 7, 如果IS=7, set=32
  • DL 只读, D-cache line size, line_size = 2^(DL+1)
  • DA 只读, D-cache way, way = DA + 1

l2 cache 配置


SET_SIZE LINE_SIZE ASSOC 都是只读的,  软件不能进行配置, L2_BYPASS 可写配置来禁用 L2 cache.
软件可以读 SET_SIZE LINE_SIZE ASSOC 来获取 l2 的配置.

Feature


支持 lock.
支持 bypass 模式, 可以禁用 L2 cache.
通过配置 GCR_L2_CONFIG (GCR offset 0x0130) 寄存器来配置 l2 cache

l1 cache CCA - pma

pma0cfg - pma63cfg

控制 pmp 配置地址的 CCA 属性

应该是配置的 L1 cache 的 CCA. 对应 hart 的 CCA 属性
如果对应的 pmp entry 没有配置, 则默认返回 UC (uncached)

  • Bit [3] S 位代表支持预测
  • Bit [2:0] CCA 属性
    • 0 为 cache_enable
    • 2 为 cache disable
    • 3 为 uncache 加速, 启用 store buffer?
      • uncached Accelerated (code #7 ): Uncached stores are gathered together for more effient bus utilization.
      • When performing uncached accelerated writes, the write buffer significantly reduces the number of write transactions On the external interface and reduces the amount of stalling in the core caused by the issuance of multiple writes in a Short period of time.
      • 写缓冲显著减少了外部接口上的写事务数量,并减少了内核中由于在短时间内发出多次写操作而引起的停顿。
      • 写缓冲可以将多个写操作收集在一起,然后执行突发写入,以提高总线的效率。支持对小于双字的任何大小进行不缓存的加速收集。

cache_enable 时的策略:
可缓存、一致性、写回、写分配、读缺失请求共享(代码#5): 维持一致性数据。加载缺失请求以共享状态请求数据(如果数据未被其他 CPU 共享,将获取独占状态)。多个缓存可以包含共享状态的数据。存储操作将数据带入缓存并处于独占状态 - 没有其他缓存可以包含相同的缓存行。如果存储命中了缓存中的共享行,该行将被更新为独占状态,并且其他 L1 数据缓存中的共享副本将被失效。

pma0cfg 控制 pmp0addr/pmp0cfg 对应的地址范围

pma63cfg 控制 pmp63addr/pmp63cfg 对应的地址范围

注意:
复用 csr, 策略同 pmpcfg/pmpaddr 寄存器:
pma0cfg-pma7cfg 共同组成 pmacfg0 csr

pma56cfg-pma63cfg 共同组成 pmacfg14 csr

RV64 中只用到
pmacfg0 pmacfg2 pmacfg4 pmacfg6 pmacfg8 pmacfg10 pmacfg12 pmacfg14 8 组寄存器
RV64:
pmacfg0:

pmacfg14:

pmp entry 的序号越小, 优先级越高. 如果多个 pmp entry 覆盖了同一段地址范围, 则按序号最小的 pmp entry 进行地址匹配.

1
2
3
4
5
6
7
8
-: inaccessible (NO_PERM), =: accessible (ALL_PERM)

pmp[0] |-------| | : memory 0
pmp[1] | |---------| | : memory 1
pmp[2] | |==========| | : memory 2
pmp[others] | | : undefined
pmp[N] |========================================| : memory N
result |-------========---------================|

l2 cache coherence enable

对应 GCR.Core[0-63].COH_EN Register, 将该寄存器置 1, 代表开启 l2 coherence.
GCR_BASE offset: 0x020f8 + 0x100 * CORENUM
CORENUM 可以从 mhartid 中取得

CORENUM:

1
2
csrr t0, mhartid
ext t1, t0, 4, 8 // t1 corenu

文档中没有找到可以单独配置 l2 cache CCA 属性.

cache 初始化

L1 icache 初始化

可以使用 MGINVI 或 FENCE.I 指令来初始化 icache.
? 不用清 cacheline 的 tag.

L2 cache 初始化

自动模式和手动模式

L2 cache 由硬件进行自动初始化

当下面条件满足时, 由硬件自动对L2 cache 初始化:
外部 pin si_cpc_l2_hw_init_inhibit 拉低, 表明可以由硬件自动初始化

  • 设置 CPC_CL_STAT_CONF_REG (CPC 0x0008 offset) 的 L2_HW_INIT_EN bit
  • 超出 L2 初始化开始倒计时的时延 delay 后, 硬件自动开始初始化流程
  • MBIST 未启用, 如果启用了 MBIST, 只有当 MBIST 完成后才开始初始化流程
  • 初始化完成后, GCR_L2_RAM_CONFIG (GCR offset 0x0240) 的 HCI_DONE 位会被硬件置1,  软件可以查询该 bit 确定 L2 cache 是否已经被初始化完成.

MBIST 内存自检测(Built-In Self-Test,BIST)
MIPS 支持 BIST 以测试 l2-cache.

L2 cache 手动被硬件初始化

可以选择只初始化 tag ram, 或初始化l2 cache line的 tag 和 data ram, 当下面条件满足时:
外部pin si_cpc_l2_hw_init_inhibit 拉高, 表明不进行自动硬件初始化

由软件进行初始化:

  1. 读取 GCR_L2SM_COP (GCR 0x0620 offset) 的 L2SM_COP_REG_PRESENT [31]位, 值为1表示支持 flush l2 cache 操作
  2. 读取 GCR_L2SM_COPL2SM_COP_MODE [5] 位, 这个位值必须为0, 表明此时可以进行 cache 初始化
  3. 软件重置 L2 cache 的 TAG RAM 或重置 TAG 和 DATA RAM, 操作 GCR_L2_TAG_ADDR (GCR 0x0600 offset) 和 GCR_L2_DATA (GCR 0x0610)
  4. 设置 GCR_L2SM_COPL2SM_COP_STATE [4:2] bit, 设置 0x1 表明 TAG RAM 已经被软件初始化, 设置为 0x2 表明 TAG DATA RAM 都已经被软件初始化
  5. 设置 GCR_L2SM_COPL2SM_COP_CMD [1:0] bit, 为 0x1, 表明开始进行 L2 cache 的初始化流程
  6. 读取 GCR_L2SM_COPL2SM_COP_RESULT [8:6] bit, 值为0 表明 L2 cache 的初始化流程正在进行中, 为 1 表明初始化流程已经完成且未发生错误.

cache 操作

  • MCACHE:此指令用于对指令缓存(LI 缓存)、数据缓存和 L2 缓存执行各种操作。这些操作在后面详细介绍.
  • PREF:此指令导致数据在缓存之间移动,以提高程序性能。REF 不会引发与地址相关的异常,包括 TLB 异常。
  • FENCE.I: 在写入内存中的程序映像时,应使用此指令,以使新存储的指令操作码通过 I-Cache 对指令获取逻辑可见。相当于 mips 指令集的 SYNCI:此指令在 cluster 中的所有指令缓存上操作。在多 cluster 系统中, 对所有 L1 指令缓存上操作。
  • MGINVT:这是 P8700-F 中的新指令,可用于使系统中的所有 L1 指令缓存无效。在多 cluster 系统中,这意味着在所有集群中的所有 L1 指令缓存上操作。

全局化指令只覆盖 l1-icache l2-cache, 没有覆盖 l1-dcache:

  • FENCE.I 和 MCACHE I Hit Invalidate 指令是”全局化”的,这意味着它们将从系统中的所有 L1 指令缓存中使目标缓存行无效。
  • 在多 cluster 系统中,MCACHE L2 Hit Invalidate、L2 Hit Writeback 和 L2 Hit Writeback Invalidate 操作也被全局化,将在系统中的所有 L2缓存上执行指定的操作(包括为维护包容性所需的任何 LI D-Cache 操作)。

#TODO 确认是否可以作用在多 cluster 间 @yifan.lin

注意,P8700-F MPS 不会全局化 CACHE D Hit Invalidate、D Hit Writeback 或 D Hit Writeback Invalidate 指令;这些指令只会影响执行该指令的核心的 LI D-Cache。

PREF

指令

PREF hint, imm($rs1)

hint 代表 type

  • hint[4:3]
    • 0 - l1_icache
    • 1 - l1_dcache
    • 2 - l2_cache
    • 3 - l3_cache
  • Hit[2:0]
    • 0 - load
    • 1 - store (不为 l1 icache)
    • 7 - prepareForStore (不为 l1 icache 时)
      • 如对应 cache line 未命中, 逐出或 invalidate 该 cache-line, 并将 cache line 的 data 填 0, 更新 cache line 为 modify 状态; 如 cache line 命中, 则只更新 cache line 为 Modify 状态.
        imm 偏移量
        rs1 地址

预取操作不会影响被 lock 的 cache line.
多核方案中, 该指令会修改 cache-line 状态, 意味着可能会导致另一个处理器的 cache-line 状态变更, 可能导致其他 core 的数据被逐出

L2 Prefectch

L2 预取操作使用两个 CM 的寄存器进行配置.

  • GCR_L2_PFT_CONTROL (GCR_BASE offset 0x0300)
  • GCR_L2_PFT_CONTROL_B (GCR_BASE offset 0x0308)
    这些控制寄存器支持以下 feature:
  • 地址段可选 4k, 8k, 16k, 32k, 64k
  • prefetch enable
  • code prefetch enable
  • coherent invalidate requests
  • l2 prefetch cm port id, 每个 bit 对应 cm 的一个端口 id, 设置 portid 后, 对应的 CM 端口被控制进行预取.

prefetch 使能

数据预取
通过配置 GCR_L2_PFT_CONTROL 的 PFTEN [8] bit 置 1 使能.
PAGE_MASK [31:12] 设置地址段.
NPFT [7:0] 只读, 软件可以查询该位确定预取的单元总数. #TODO

CM 端口

共 8 个 CM 端口可用来选择进行 l2 prefetch
可以操作 GCR_L2_PFT_CONTROL_B 的 PORT_ID [7:0] 位选择开启对应 port_id 的预取.
该字段的每个 bit 对应一个端口.
可以有多个 core 和 iocu 的组合.
该字段的组织方式由 core 开始, 如 4 core, 2 iocu.
则 0-3 bit 代表 core0-3, 4-5 代表 iocu 0-1

代码预取

除数据预取外, CM 还支持代码预取
可通过 GCR_L2_PFT_CONTROL_B 的 CEN [8] bit 启用代码预取.

mcache

mcache 操作

缓存操作用于控制操作,如初始化、失效、驱逐等。以下是缓存操作的简要描述:

  1. 索引写回失效(Index Writeback Invalidate):如果指定索引处的缓存行状态为有效且脏,该行将被写回到由缓存标记指定的内存地址。完成该操作后,缓存行的状态将设置为无效。如果行有效但不脏,则将行的状态设置为无效。
  2. 索引加载标记(Index Load Tag):读取指定索引处缓存行的标记地址、标记状态和标记 ECC 位。还会读取数据 RAM 中的双字数据和 ECC。
  3. 命中失效(Hit Invalidate):如果缓存包含指定地址,该缓存行的状态将设置为无效。
  4. 命中写回失效(Hit Writeback Inv):如果缓存包含指定地址且该行有效且脏,该行的内容将写回到主存。完成该操作后,缓存行的状态将设置为无效。如果行有效但不脏,则将行的状态设置为无效。
  5. 命中写回(Hit Writeback):如果缓存包含指定地址且该行有效且脏,该行的内容将写回到主存。完成操作后,行的状态保持有效,但脏状态被清除。
  6. 索引存储标记(Index Store Tag):写入指定索引处缓存行的地址、标记状态、LRU 位和双字数据。可以选择写入 ECC,或者让硬件根据加载的双字生成 ECC。
  7. 获取并锁定(Fetch And Lock):如果缓存包含指定地址,锁定该行。如果缓存不包含指定地址,从主存重新填充该行,然后锁定该行。

mcache 指令


rs1 为寄存器

1
2
3
4
// 将addr  line_size 对应的低位置0 后,  放到某一个通用寄存器中, 将寄存器号传给mcache
asm volatile("mcache %0,(%1)"::"i"(op),"r"(addr));
mcache op,(csr_no)
ihb //instruction hazard barrier, 执行mache后需要运行ihb, 表示接下来的取指依赖mcache 执行的结构
  • I - l1-icache
  • D - l1-dcache
  • S - l2-cache




    其中涉及到的 L2 的 GCR 寄存器见下一章详细介绍, 其用法已经在表格中列出
    但是涉及到的 iTagLo/DtagLo/iDataHi/idatalo/DDataLow/DDataLo/DDataHi 寄存器未在其他文档中找到, 需要确认这个地方是否实现了, 是否是抄的 mips 文档抄错了? #TODO

ECC

l1 cache 和 l2 cache 均支持 ecc (error checking and correction)
对于 single-bit 单 bit 翻转错误, 硬件支持纠错恢复, 对软件是透明的
当检测到 2 bit 错误, 会产生异常.
超过 2 bit, 不操作.

对 l1-icache, 仅支持 edc (error detection), 当检测到数据损坏时, 会重新从地址中取指令, 该操作对于软件是透明的.

GCR

GCR.Global.L2_DATA

GCR_BASE 0x0610

L2 load tag mcache 指令, 将读取到的 L2 cacheline data 数据保存到了 GCR.Global.L2_DATA 寄存器中.
L2 store tag/data mcache 指令, 将 GCR.Global.L2_DATA 数据 dword index 加载到 l2 对应地址的 cacheline data 中.

GCR.Global.L2_TAG_ADDR

GCR_BASE 0x0600

L2 Load tag 指令, 将 L2 tag rams 加载到该寄存器
L2 store tag 指令, 将该寄存器内容保存到 L2 tag ram.

TAG_ADDR 保存 L2 Tag Ram entry 的地址部分,

GCR.Global.L2_TAG_STATE

GCR_BASE 0x0608
mcache 对某地址进行 L2 LOAD TAG 操作后, 会将对应的 cacheline tag state 加载到该寄存器.
mcache 对某地址进行 L2 STORE TAG 操作前, 可以写该寄存器, 设置 L2 cacheline 的 tag state.

GCR.Glocal.L2_RAM_CONFIG

GCR_BASE 0x240
HCI_DONE [30] bit 表示 l2 cache 已经被硬件初始化完成
L2 cache 由硬件进行自动初始化

GCR.Global.L2SM_COP

GCR_BASE 0x0620
L2 cache 手动被硬件初始化

GCR.GLOBAL.L2_PFT_CONTROL

GCR_BASE 0x0300
L2 Prefectch

GCR.GLOBAL.L2_PFT_CONTROL_B

GCR_BASE 0x0308
L2 Prefectch

case 验证

通过的 case:

  • cache 使能
  • self modify 的 icache 指令刷新功能的验证
  • mcache 的 Hit_Wb_Inv_D Hit_Wb_Inv_S Hit_Inv_D Hit_Inv_S 操作初步验证

未进行的 case:

  • 涉及 cache line 的 tag/data 的测试, 未进行, 资料不全, 缺少 iTagLo/DtagLo/iDataHi/idatalo/DDataLow/DDataLo/DDataHi 寄存器的介绍.
  • cache flush invalidate wb 等的压测
  • l2 禁用测试 #TODO l2 coherence 不开有什么影响, 贴结果?
  • 多核一致性测试

==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

%%

Drawing

1
{"type":"excalidraw","version":2,"source":"https://excalidraw.com","elements":[],"appState":{"theme":"dark","gridSize":null,"viewBackgroundColor":"#ffffff"}}

%%

csr

target/riscv/csr.c

新增

  • mipstvec
  • mipsintctl
  • mipsconfig6 空实现
  • mipsconfig7 空实现
  • marchid
  • pmacfg0-pmacfg15

helper 指令集相关

target/riscv/cpu_helper.c

riscv_cpu_update_mip_from_pin



在 hip 中,我们将 CIP201P 到 CIP191P 和 LCOFIP 进行镜像处理,因为它们可以通过 hideleg 委派到虚拟模式,而所有可以委派的位在 hip 中都进行了镜像。我们也在 sip 中镜像了这些位,因为非 H 扩展的监管软件会查看该 CSR 来查看哪些中断是待处理的。至于是否需要在 hip 中镜像这些位,目前标记为待办事项[ #TODO ],具体是否需要取决于实际需求和设计考虑。


H-extension 相关

与 riscv 公版对比

无 HVIP csr

wave qemu 中并没有对 H 相关的 csr 和指令进行修改, 采用的是 5.0 公版的
其行为与当前的 qemu 8.0 上最新规范不一样是正常的.
另外无法确定 H-extension 在 qemu 上的行为是否与开发板一致.

组件

cmgcr
cps
cpc

mtime 来自于 cpc 读取 rtc 时钟.

指令

lwp
swp
ldp
sdp
lsa
lsa_w
mcache
extins
zba zbb ccmov

==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

%%

Drawing

1
{"type":"excalidraw","version":2,"source":"https://excalidraw.com","elements":[],"appState":{"theme":"dark","gridSize":null,"viewBackgroundColor":"#ffffff"}}

%%

{"created_time":"2021-11-03T06:03:51Z","files":[{"attachment_folder":"","created_time":"2021-11-03T06:03:51Z","id":"226","modified_time":"2021-11-03T06:03:51Z","name":"任务调度.md","signature":"40816710133319","tags":[]}],"folders":[],"id":"225","modified_time":"2021-11-03T06:03:51Z","signature":"125904307234375","version":2}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType )
{
Queue_t *pxNewQueue;
size_t xQueueSizeInBytes;
uint8_t *pucQueueStorage;

if( uxItemSize == ( UBaseType_t ) 0 )
{
/* There is not going to be a queue storage area. */
xQueueSizeInBytes = ( size_t ) 0;
}
else
{
xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize );
}
// 分配空间
pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes );

if( pxNewQueue != NULL )
{
/* Jump past the queue structure to find the location of the queue
storage area. */
pucQueueStorage = ( ( uint8_t * ) pxNewQueue ) + sizeof( Queue_t );

#if( configSUPPORT_STATIC_ALLOCATION == 1 )
{
pxNewQueue->ucStaticallyAllocated = pdFALSE;
}
#endif /* configSUPPORT_STATIC_ALLOCATION */
prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue );
}
return pxNewQueue;
}

#endif /* configSUPPORT_STATIC_ALLOCATION */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue )
{
Queue_t * const pxQueue = ( Queue_t * ) xQueue;
// 进入临界区
taskENTER_CRITICAL();
{
//队列空间的尾部
pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );
pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
//写入数据的起始位置, 没有队列项的话, 就从队列头开始写, 有队列项的话, 从队列项的空间的起始地址写
pxQueue->pcWriteTo = pxQueue->pcHead;
//队列的最后一个列表项的起始位置
pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize );
pxQueue->cRxLock = queueUNLOCKED;
pxQueue->cTxLock = queueUNLOCKED;

if( xNewQueue == pdFALSE )
{ // 这个地方暂时不用管, 因为初始化时 xNewQueue传入的是pdTrue
if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )
{
if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )
{
queueYIELD_IF_USING_PREEMPTION();
}
}
}
else
{
// 初始化xTasksWaitingToSend xTasksWaitingToReceive列表, 这两个接受的都是任务的事件列表项
vListInitialise( &( pxQueue->xTasksWaitingToSend ) );
vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );
}
}
// 退出临界区
taskEXIT_CRITICAL();
return pdPASS;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )
{
BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
TimeOut_t xTimeOut;
Queue_t * const pxQueue = ( Queue_t * ) xQueue;

// 进入这个函数, 调度器是挂起状态时, xTicksToWait 必须是0
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
{
configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
}
#endif
// 为了获得最高效率而放宽了编码标准:有多个返回点
for( ;; )
{
// 进入临界区, 关闭tick中断
taskENTER_CRITICAL();
{
// 队列还有空闲? 正在运行的任务一定要比等待访问队列的任务优先级高.
// 如果使用覆盖式入队,则不需要关注队列是否满
if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
{
//完成数据拷贝工作,分为从队列尾入队,从队列首入队和覆盖式入队, 此处有空闲时, 可以是队列尾入队,从队列首入队和覆盖式入队
// 没有空闲时, 则只能是覆盖式入队
xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
... // 省略了 configUSE_QUEUE_SETS 宏打开的情况, 有需求再看, 默认是关闭的
#else /* configUSE_QUEUE_SETS */
{
/* If there was a task waiting for data to arrive on the
queue then unblock it now. */
// 是否有任务等待的数据(take)到了, 等到的话就把这个任务解除阻塞
if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
{
// 本函数send意思就是把要take的数据送过来的意思, 上面的prvCopyDataToQueue 就是送数据过来
// 这里是把xTasksWaitingToReceive中的等待事件的任务排在最前面的出队, TCB的事件列表项在调用take这个xQueue的时候会将自己的事件列表项挂到xQueue的xTasksWaitingToReceive列表中, 这个函数做的事情比较多, 需要在后面详细描述 // TODO
if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
{
// 如果上面排在最前面的任务出队后,加入到readylist中, 同时刷新了最高优先级, 优先级如果比当前正在运行的任务优先级高, 调度到这个任务
<---- queueYIELD_IF_USING_PREEMPTION();
}
}
// 等待的数据没到, 但是xYieldRequired 是true时, 也可能切换任务, 这个值是prvCopyDataToQueue的返回值,
else if( xYieldRequired != pdFALSE )
{
// 这个支线处理特殊情况, 如果任务take多个mutex, 但是take mutex的顺序与 give mutex的顺序不一致, 也会切换任务?
<--- queueYIELD_IF_USING_PREEMPTION();
}
}
#endif /* configUSE_QUEUE_SETS */
// 关闭临界区, 打开tick中断
taskEXIT_CRITICAL();
<---- return pdPASS;
}
// 队列满了且不是覆盖式入队的场景
else
{
// 不阻塞任务, 没有timeout的场景, give数据,立即返回
if( xTicksToWait == ( TickType_t ) 0 )
{
// 关闭临界区, 打开tick中断
taskEXIT_CRITICAL();
<----- // 返回队列满
return errQUEUE_FULL;
}
// 设置了timeout, 但是队列又是满的场景
else if( xEntryTimeSet == pdFALSE )
{
// 初始化xTimeOut 结构体
vTaskInternalSetTimeOutState( &xTimeOut );
xEntryTimeSet = pdTRUE;
}
}
}
// 关闭
taskEXIT_CRITICAL();

// 到这里说明是切换任务后回来了, 或者是队列满了又不是覆盖式入队,且又设置了timeout的场景
// 挂起调度器
vTaskSuspendAll();
// 把Queue上锁
// /* 退出临界区,至此,中断和其它任务可以向这个队列执行入队(投递)或出队(读取)操作.
// 因为队列满,任务无法入队,下面的代码将当前任务将阻塞在这个队列上
// 在这段代码执行过程中我们需要挂起调度器,防止其它任务操作队列事件列表;
// 挂起调度器虽然可以禁止其它任务操作这个队列,但并不能阻止中断服务程序操作这个队列,因此还需要将队列上锁
// 防止中断程序读取队列后,使其它任务解除阻塞,执行上下文切换(因为调度器挂起后,不允许执行上下文切换) */
prvLockQueue( pxQueue );

/* 查看任务的超时时间是否到期 */
// 任务超时时间未到期
if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
{
// 队列满了
if( prvIsQueueFull( pxQueue ) != pdFALSE )
{
// 队列满了, 将give 数据(信号量)的任务挂到Queue的xTasksWaitingToSend列表下
vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );

// * 解除队列锁,如果有任务要解除阻塞,则将任务移到pending ready list中(因为当前调度器挂起,所以不能移到ready list)*/
prvUnlockQueue( pxQueue );
// 恢复调度器,将任务从挂起就绪列表移到就绪列表中, 返回值是xAlreadyYielded, 已经切换过任务的意思, 没有切换的话,这个值是false
if( xTaskResumeAll() == pdFALSE )
{
portYIELD_WITHIN_API();
}
}
// 未到期, 队列未满, 重试
else
{
/* Try again. */
prvUnlockQueue( pxQueue );
( void ) xTaskResumeAll();
}
}
// 任务超时时间到期了
else
{
// 解除队列锁定
prvUnlockQueue( pxQueue );
// 恢复调度器, 同时将pending ready list中的任务挪到 ready list中
( void ) xTaskResumeAll();
// 返回 errQUEUE_FULL
<---- return errQUEUE_FULL;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition )
{
BaseType_t xReturn;
UBaseType_t uxSavedInterruptStatus;
Queue_t * const pxQueue = ( Queue_t * ) xQueue;
//balabala, 支持中断嵌套的系统需要配置这个, 一堆解释, 后面有需要再看, mips不支持中断嵌套
portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
// 暂存status mask 中断状态
uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
{
1. ---> // 队列未满或者是覆盖式入队的场景
if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
{
const int8_t cTxLock = pxQueue->cTxLock;
// /*完成数据拷贝工作,分为从队列尾入队,从队列首入队和覆盖式入队*/
( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
/*检查队列是否上锁,如果上锁,则队列事件列表不能被改变 */
if( cTxLock == queueUNLOCKED )
{
...// 省略配置了configUSE_QUEUE_SETS的情况
#else /* configUSE_QUEUE_SETS */
{
if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
{
if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )
{
/* 解除阻塞的任务优先级比当前任务高,记录上下文切换请求,等返回中断服务程序后,可以显式的强制上下文切换 */
if( pxHigherPriorityTaskWoken != NULL )
{
*pxHigherPriorityTaskWoken = pdTRUE;
}
}
}
}
#endif /* configUSE_QUEUE_SETS */
}
else
{
/* 队列上锁,增加锁计数器,等到任务解除队列锁时,使用这个计数器就可以知道有多少数据入队,可以最多解除多少个因等待从队列读数据而阻塞的任务 */
pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 );
}
xReturn = pdPASS;
}
else
{
// 队列满了且不是覆盖式入队的情况, 直接返回error full,
xReturn = errQUEUE_FULL;
}
}
// 恢复status mask中断状态
portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
return xReturn;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition )
{
BaseType_t xReturn = pdFALSE;
UBaseType_t uxMessagesWaiting;
uxMessagesWaiting = pxQueue->uxMessagesWaiting;
// 每个队列项占的空间是0的话, 比如二进制信号量/计数信号量/互斥量, 不需要额外做别的操作, 直接把uxMessagesWaiting+1 即可
if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )
{
#if ( configUSE_MUTEXES == 1 )
{
if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )
{
// 这里是投递来了mutex, 因为mutex和二进制信号量还有计数信号量不一样, mutex 是成对调用的, 一个task被take后,只能被该task give(release), 其他task才能take到. 因此需要pxMutexHolder字段记录持有者, 这里是give, 说明现在mutex是无主的了, 别的task可以take了.
xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder );
// pxMutexHolder 就是 pcTail
pxQueue->pxMutexHolder = NULL;
}
}
#endif /* configUSE_MUTEXES */
}
// 有队列项存储空间的话, 拷贝到队尾, 如果是第一个item的话, 起始是从队列项空间的起始地址开始写, 再往后的话, 就是每次+uxItemSize
else if( xPosition == queueSEND_TO_BACK )
{
// 将传递的数据拷贝到Queue的空间了
( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );
// 如果是第一个item的话, 起始是从队列项空间的起始地址开始写, 再往后的话, 就是每次+uxItemSize
pxQueue->pcWriteTo += pxQueue->uxItemSize;
if( pxQueue->pcWriteTo >= pxQueue->pcTail )
{
pxQueue->pcWriteTo = pxQueue->pcHead;
}
}
// 有队列项存储空间, 拷贝到队首, 如果是第一个item的话, 起始是从队列项空间的尾部地址减去一个uxItemSize(保证有空间能刚好放下这个item,写完后这个item的尾巴地址正好是队列项存储空间的尾巴地址), 再往后的话, 就是每次-uxItemSize
else
{
// 将传递的数据拷贝到Queue的空间了
( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );
pxQueue->u.pcReadFrom -= pxQueue->uxItemSize;
if( pxQueue->u.pcReadFrom < pxQueue->pcHead )
{
pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize );
}
// 覆盖写入时, 队列项只有1个, 覆盖它, 所以uxMessagesWaiting 不变.
if( xPosition == queueOVERWRITE )
{
if( uxMessagesWaiting > ( UBaseType_t ) 0 )
{
--uxMessagesWaiting;
}
}
}

pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1;

return xReturn;
}

==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Text Elements

Source ^jENEYj0t

signature ^T3XwwDU2

Attestation
Certificate ^Rs3Q57DL

pub key ^IPuKghKB

Attestation
CA ^jf35oBjr

signature ^YhW98mwR

Root
CA ^f71DBiM5

signature ^TFM6hvTi

pub key ^c8ScYfTq

pub key ^8ll4rIEo

校验链 ^BGTRqeqL

priv key ^j4FfjOmM

priv key ^1hiboPOO

priv key ^x2dkXUTC

校验 ^jh9JHuXJ

校验 ^hHzBEpMr

校验 ^yIeziZyq

生成 ^ZTy1Nf0f

生成 ^dEFcophI

生成 ^ldwMpBOP

efuse ^fR1wmS0i

root pub key hash ^9mi1XEAK

%%

Drawing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"type": "rectangle",
"version": 136,
"versionNonce": 66212208,
"isDeleted": false,
"id": "36BFfNkJqMTHwe7i6-Sgl",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -303.9523184640066,
"y": -789.8333263397217,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 127.33331298828125,
"height": 140.6666717529297,
"seed": 1734679920,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "jENEYj0t",
"type": "text"
},
{
"id": "94SWWEkQwJzEcku1HA014",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "rectangle",
"version": 226,
"versionNonce": 673824144,
"isDeleted": false,
"id": "72OMIhK39fg3vnmikdSgt",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -303.9523184640066,
"y": -649.8333263397217,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 127.33331298828125,
"height": 35,
"seed": 52015504,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "T3XwwDU2",
"type": "text"
},
{
"id": "1Qs-9utnp5cHxu6ikGs8e",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 39,
"versionNonce": 1290142096,
"isDeleted": false,
"id": "jENEYj0t",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -298.9523184640066,
"y": -731.9999904632568,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 25,
"seed": 432009072,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 20.05697657919338,
"fontFamily": 1,
"text": "Source",
"rawText": "Source",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "36BFfNkJqMTHwe7i6-Sgl",
"originalText": "Source"
},
{
"type": "text",
"version": 46,
"versionNonce": 1104105360,
"isDeleted": false,
"id": "T3XwwDU2",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -298.9523184640066,
"y": -644.8333263397217,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 25,
"seed": 1443692432,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 20.05697657919338,
"fontFamily": 1,
"text": "signature",
"rawText": "signature",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "72OMIhK39fg3vnmikdSgt",
"originalText": "signature"
},
{
"type": "rectangle",
"version": 153,
"versionNonce": 377922416,
"isDeleted": false,
"id": "CWl5UijEngs-LKODxNOpN",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -299.4523337227957,
"y": -552.6666164398193,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 127.33331298828125,
"height": 140.6666717529297,
"seed": 485523824,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "Rs3Q57DL",
"type": "text"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "rectangle",
"version": 255,
"versionNonce": 1966836624,
"isDeleted": false,
"id": "WHL3Me6tig67PXJfkVpeZ",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -300.2856924874441,
"y": -412.66661643981934,
"strokeColor": "#000000",
"backgroundColor": "#7950f2",
"width": 127.33331298828125,
"height": 35,
"seed": 1231457680,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "IPuKghKB",
"type": "text"
},
{
"id": "W8dTKlRi6C9g4nzPxZIYO",
"type": "arrow"
},
{
"id": "94SWWEkQwJzEcku1HA014",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 104,
"versionNonce": 677305744,
"isDeleted": false,
"id": "Rs3Q57DL",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -294.4523337227957,
"y": -502.3332805633545,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 40,
"seed": 1346294640,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 16.09129237993247,
"fontFamily": 1,
"text": "Attestation\nCertificate",
"rawText": "Attestation\nCertificate",
"baseline": 34,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "CWl5UijEngs-LKODxNOpN",
"originalText": "Attestation\nCertificate"
},
{
"type": "text",
"version": 82,
"versionNonce": 1909238672,
"isDeleted": false,
"id": "IPuKghKB",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -295.2856924874441,
"y": -407.66661643981934,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 25,
"seed": 1985895312,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 20.114115474915586,
"fontFamily": 1,
"text": "pub key",
"rawText": "pub key",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "WHL3Me6tig67PXJfkVpeZ",
"originalText": "pub key"
},
{
"type": "rectangle",
"version": 220,
"versionNonce": 918599024,
"isDeleted": false,
"id": "bjeEf9BibAYRfcEhCd-j8",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -295.4523337227957,
"y": -309.3333034515381,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 127.33331298828125,
"height": 140.6666717529297,
"seed": 1777526128,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "jf35oBjr",
"type": "text"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "rectangle",
"version": 362,
"versionNonce": 451123600,
"isDeleted": false,
"id": "KgdFtgZ4evBoWlhPTL0DH",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -295.4523337227957,
"y": -135.16666221618652,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 127.33331298828125,
"height": 35,
"seed": 254568848,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "YhW98mwR",
"type": "text"
},
{
"id": "Y8Ej_IWMq2qqJivdoUzzg",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 200,
"versionNonce": 909138934,
"isDeleted": false,
"id": "jf35oBjr",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -290.4523337227957,
"y": -259.99996757507324,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 42,
"seed": 391427952,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650369667844,
"link": null,
"fontSize": 16.183105653529545,
"fontFamily": 1,
"text": "Attestation\nCA",
"rawText": "Attestation\nCA",
"baseline": 36,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "bjeEf9BibAYRfcEhCd-j8",
"originalText": "Attestation\nCA"
},
{
"type": "text",
"version": 181,
"versionNonce": 1327695760,
"isDeleted": false,
"id": "YhW98mwR",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -290.4523337227957,
"y": -130.16666221618652,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 25,
"seed": 1057535888,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 20.05697657919338,
"fontFamily": 1,
"text": "signature",
"rawText": "signature",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "KgdFtgZ4evBoWlhPTL0DH",
"originalText": "signature"
},
{
"type": "rectangle",
"version": 266,
"versionNonce": 703104880,
"isDeleted": false,
"id": "mNKzKGzW4QfkKR3Zh_jDM",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -288.1189596993582,
"y": -65.33330345153809,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 127.33331298828125,
"height": 140.6666717529297,
"seed": 481053040,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "f71DBiM5",
"type": "text"
},
{
"id": "ExaAhYlwSGVvf3umJQZh6",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 269,
"versionNonce": 651405610,
"isDeleted": false,
"id": "f71DBiM5",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -283.1189596993582,
"y": -15.999967575073242,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 42,
"seed": 170608016,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650369667847,
"link": null,
"fontSize": 16.275442792892623,
"fontFamily": 1,
"text": "Root\nCA",
"rawText": "Root\nCA",
"baseline": 36,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "mNKzKGzW4QfkKR3Zh_jDM",
"originalText": "Root\nCA"
},
{
"type": "rectangle",
"version": 276,
"versionNonce": 744089488,
"isDeleted": false,
"id": "ZIoD4F_JoAavJkzZ2HYRt",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -298.61897495814725,
"y": -376.8333339691162,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 127.33331298828125,
"height": 35,
"seed": 1967233904,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "TFM6hvTi",
"type": "text"
},
{
"id": "xPssLeJADFD3Rca5UdnJH",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 95,
"versionNonce": 395469712,
"isDeleted": false,
"id": "TFM6hvTi",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -293.61897495814725,
"y": -371.8333339691162,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 25,
"seed": 768349072,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 20.05697657919338,
"fontFamily": 1,
"text": "signature",
"rawText": "signature",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "ZIoD4F_JoAavJkzZ2HYRt",
"originalText": "signature"
},
{
"type": "rectangle",
"version": 501,
"versionNonce": 1279662448,
"isDeleted": false,
"id": "dUBgzY18QCXOWFGgrcZR0",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -287.78576878138944,
"y": 75.66681861877441,
"strokeColor": "#000000",
"backgroundColor": "#7950f2",
"width": 127.33331298828125,
"height": 35,
"seed": 1935453552,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "c8ScYfTq",
"type": "text"
},
{
"id": "ExaAhYlwSGVvf3umJQZh6",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 329,
"versionNonce": 2090824080,
"isDeleted": false,
"id": "c8ScYfTq",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -282.78576878138944,
"y": 80.66681861877441,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 25,
"seed": 2302352,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 20.114115474915586,
"fontFamily": 1,
"text": "pub key",
"rawText": "pub key",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "dUBgzY18QCXOWFGgrcZR0",
"originalText": "pub key"
},
{
"type": "rectangle",
"version": 571,
"versionNonce": 366376336,
"isDeleted": false,
"id": "CErCltXmQ-KO97qLeBKPD",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -295.28576878138944,
"y": -169.3331813812256,
"strokeColor": "#000000",
"backgroundColor": "#7950f2",
"width": 127.33331298828125,
"height": 35,
"seed": 1615167344,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "8ll4rIEo",
"type": "text"
},
{
"id": "ExaAhYlwSGVvf3umJQZh6",
"type": "arrow"
},
{
"id": "W8dTKlRi6C9g4nzPxZIYO",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 399,
"versionNonce": 416989072,
"isDeleted": false,
"id": "8ll4rIEo",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -290.28576878138944,
"y": -164.3331813812256,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 117.33331298828125,
"height": 25,
"seed": 1349021584,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 20.114115474915586,
"fontFamily": 1,
"text": "pub key",
"rawText": "pub key",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "CErCltXmQ-KO97qLeBKPD",
"originalText": "pub key"
},
{
"type": "line",
"version": 421,
"versionNonce": 297422811,
"isDeleted": false,
"id": "vsfIt2mPYUA0GPY2aYlpb",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -133.17463223896317,
"y": -709.555562125312,
"strokeColor": "#000000",
"backgroundColor": "#7950f2",
"width": 185.46302795410145,
"height": 778.6111068725584,
"seed": 474222960,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
185.46302795410145,
45.92592027452258
],
[
153.0555809868706,
743.6111068725584
],
[
2.2222222222221717,
778.6111068725584
]
]
},
{
"type": "text",
"version": 471,
"versionNonce": 1337939382,
"isDeleted": false,
"id": "BGTRqeqL",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 52.381101335798064,
"y": -401.2779666052925,
"strokeColor": "#000000",
"backgroundColor": "#7950f2",
"width": 96,
"height": 37,
"seed": 1188298128,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650369671772,
"link": null,
"fontSize": 33.051103854633304,
"fontFamily": 4,
"text": "校验链",
"rawText": "校验链",
"baseline": 30,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "校验链"
},
{
"type": "rectangle",
"version": 107,
"versionNonce": 824273776,
"isDeleted": false,
"id": "ZCGy9Lt-M9MqAGEIsSI-k",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -498.21431841169084,
"y": 74.6507574111697,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 120,
"height": 42,
"seed": 1050698608,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "j4FfjOmM",
"type": "text"
},
{
"id": "Y8Ej_IWMq2qqJivdoUzzg",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 90,
"versionNonce": 1820085648,
"isDeleted": false,
"id": "j4FfjOmM",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -493.21431841169084,
"y": 79.6507574111697,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 110,
"height": 32,
"seed": 1151191952,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979838,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "priv key",
"rawText": "priv key",
"baseline": 26,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "ZCGy9Lt-M9MqAGEIsSI-k",
"originalText": "priv key"
},
{
"type": "line",
"version": 88,
"versionNonce": 1281774875,
"isDeleted": false,
"id": "W1WcmFR-SZBdQxtvoKrj2",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -374.0833587646484,
"y": 95.14678915720128,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 85.71428571428572,
"height": 1.904754638671875,
"seed": 899839344,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
85.71428571428572,
-1.904754638671875
]
]
},
{
"type": "rectangle",
"version": 167,
"versionNonce": 2089894800,
"isDeleted": false,
"id": "bpTU_FpDbuAnmKCJzTenp",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -506.7857469831194,
"y": -169.15877366444414,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 120,
"height": 42,
"seed": 1140709776,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "1hiboPOO",
"type": "text"
},
{
"id": "xPssLeJADFD3Rca5UdnJH",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 150,
"versionNonce": 817634192,
"isDeleted": false,
"id": "1hiboPOO",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -501.7857469831194,
"y": -164.15877366444414,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 110,
"height": 32,
"seed": 1720862576,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979838,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "priv key",
"rawText": "priv key",
"baseline": 26,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "bpTU_FpDbuAnmKCJzTenp",
"originalText": "priv key"
},
{
"type": "line",
"version": 148,
"versionNonce": 2002703221,
"isDeleted": false,
"id": "ONX1k-gdOXeiYNBIWvLSu",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -382.65478733607694,
"y": -148.66274191841256,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 85.71428571428572,
"height": 1.904754638671875,
"seed": 942417808,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
85.71428571428572,
-1.904754638671875
]
]
},
{
"type": "rectangle",
"version": 223,
"versionNonce": 1120042352,
"isDeleted": false,
"id": "ONlUfajbueJsLlSIwtOlz",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -511.5476662772043,
"y": -412.4920997316874,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 120,
"height": 42,
"seed": 1303894384,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "x2dkXUTC",
"type": "text"
},
{
"id": "1Qs-9utnp5cHxu6ikGs8e",
"type": "arrow"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 208,
"versionNonce": 936520080,
"isDeleted": false,
"id": "x2dkXUTC",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -506.5476662772043,
"y": -407.4920997316874,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 110,
"height": 32,
"seed": 1835054480,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979838,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "priv key",
"rawText": "priv key",
"baseline": 26,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "ONlUfajbueJsLlSIwtOlz",
"originalText": "priv key"
},
{
"type": "line",
"version": 207,
"versionNonce": 249956091,
"isDeleted": false,
"id": "OraJyyqTUrNyHgmqSeOiS",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -387.41670663016174,
"y": -391.9960679856558,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 85.71428571428572,
"height": 1.904754638671875,
"seed": 509291376,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
85.71428571428572,
-1.904754638671875
]
]
},
{
"type": "arrow",
"version": 399,
"versionNonce": 1659299498,
"isDeleted": false,
"id": "ExaAhYlwSGVvf3umJQZh6",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -156.0515231177921,
"y": 83.62927720674614,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 95.17962883474746,
"height": 206.9693326542726,
"seed": 1758692240,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650369667851,
"link": null,
"startBinding": {
"elementId": "dUBgzY18QCXOWFGgrcZR0",
"gap": 4.400932675316099,
"focus": 0.7348589452948197
},
"endBinding": {
"elementId": "CErCltXmQ-KO97qLeBKPD",
"gap": 11.437687707325665,
"focus": -0.5568105591064288
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
86.43652489071815,
-90.96921532509052
],
[
-8.743103944029315,
-206.9693326542726
]
]
},
{
"type": "arrow",
"version": 207,
"versionNonce": 1348448502,
"isDeleted": false,
"id": "W8dTKlRi6C9g4nzPxZIYO",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -166.9524557931082,
"y": -153.9138871862708,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 82.96298556857641,
"height": 208.98164039604927,
"seed": 1657027952,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650369667851,
"link": null,
"startBinding": {
"elementId": "CErCltXmQ-KO97qLeBKPD",
"gap": 1,
"focus": 0.8370906774170302
},
"endBinding": {
"elementId": "WHL3Me6tig67PXJfkVpeZ",
"gap": 14.771088857499251,
"focus": -0.45079768398447384
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
76.59662640283977,
-112.68535540255971
],
[
-6.36635916573664,
-208.98164039604927
]
]
},
{
"type": "arrow",
"version": 211,
"versionNonce": 1465322410,
"isDeleted": false,
"id": "94SWWEkQwJzEcku1HA014",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -171.83735608297678,
"y": -399.19181257580965,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 91.11117892795141,
"height": 237.77777777777783,
"seed": 1220317584,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650369667841,
"link": null,
"startBinding": {
"elementId": "WHL3Me6tig67PXJfkVpeZ",
"gap": 1.1150234161860908,
"focus": 0.8299731202533939
},
"endBinding": {
"elementId": "36BFfNkJqMTHwe7i6-Sgl",
"gap": 12.197064233204571,
"focus": 0.07146695630627588
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
82.96305338541674,
-128.8888888888889
],
[
-8.148125542534672,
-237.77777777777783
]
]
},
{
"type": "text",
"version": 11,
"versionNonce": 1260831803,
"isDeleted": false,
"id": "jh9JHuXJ",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -94.05957830519895,
"y": -38.48813147771938,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 55,
"height": 32,
"seed": 473632624,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "校验",
"rawText": "校验",
"baseline": 26,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "校验"
},
{
"type": "text",
"version": 11,
"versionNonce": 1925378293,
"isDeleted": false,
"id": "hHzBEpMr",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -109.6151338607545,
"y": -279.5992425888305,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 55,
"height": 32,
"seed": 609476496,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "校验",
"rawText": "校验",
"baseline": 26,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "校验"
},
{
"type": "text",
"version": 11,
"versionNonce": 1138263259,
"isDeleted": false,
"id": "yIeziZyq",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -111.83735608297667,
"y": -549.5992425888305,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 55,
"height": 32,
"seed": 1661444464,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "校验",
"rawText": "校验",
"baseline": 26,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "校验"
},
{
"type": "arrow",
"version": 261,
"versionNonce": 2120884790,
"isDeleted": false,
"id": "Y8Ej_IWMq2qqJivdoUzzg",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -416.2818005274212,
"y": 69.69707631307915,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 119.8294668046255,
"height": 182.70297504720736,
"seed": 1808887184,
"groupIds": [
"5rHdWwJNjVTC1YOksY9cT"
],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650369667853,
"link": null,
"startBinding": {
"elementId": "ZCGy9Lt-M9MqAGEIsSI-k",
"gap": 4.953681098090556,
"focus": 0.06655889183285534
},
"endBinding": {
"elementId": "KgdFtgZ4evBoWlhPTL0DH",
"gap": 1,
"focus": 0.8198855775916721
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
119.8294668046255,
-182.70297504720736
]
]
},
{
"type": "text",
"version": 17,
"versionNonce": 231289211,
"isDeleted": false,
"id": "ZTy1Nf0f",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -387.3929116385322,
"y": -49.599242588830464,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 55,
"height": 32,
"seed": 108131184,
"groupIds": [
"5rHdWwJNjVTC1YOksY9cT"
],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "生成",
"rawText": "生成",
"baseline": 26,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "生成"
},
{
"type": "arrow",
"version": 334,
"versionNonce": 2090101622,
"isDeleted": false,
"id": "xPssLeJADFD3Rca5UdnJH",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -419.9854816255115,
"y": -174.00663869343134,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 119.82946680462555,
"height": 182.7029750472073,
"seed": 1215118224,
"groupIds": [
"eEFuO15HuSsKvlckR4NcH"
],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650369667855,
"link": null,
"startBinding": {
"elementId": "bpTU_FpDbuAnmKCJzTenp",
"gap": 4.847865028987201,
"focus": 0.13348216343426988
},
"endBinding": {
"elementId": "ZIoD4F_JoAavJkzZ2HYRt",
"gap": 1.537039862738709,
"focus": 0.8448119389166228
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
119.82946680462555,
-182.7029750472073
]
]
},
{
"type": "text",
"version": 88,
"versionNonce": 2050705947,
"isDeleted": false,
"id": "dEFcophI",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -391.09659273662254,
"y": -293.302957595341,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 55,
"height": 32,
"seed": 750912880,
"groupIds": [
"eEFuO15HuSsKvlckR4NcH"
],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "生成",
"rawText": "生成",
"baseline": 26,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "生成"
},
{
"type": "arrow",
"version": 400,
"versionNonce": 1763937462,
"isDeleted": false,
"id": "1Qs-9utnp5cHxu6ikGs8e",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -425.17062159946994,
"y": -423.6362909286744,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 119.89725588382038,
"height": 182.80633248319418,
"seed": 2086619536,
"groupIds": [
"3DU_neE53AK_BgW75ciL-"
],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650369667857,
"link": null,
"startBinding": {
"elementId": "ONlUfajbueJsLlSIwtOlz",
"gap": 11.144191196986952,
"focus": 0.07176883629894397
},
"endBinding": {
"elementId": "72OMIhK39fg3vnmikdSgt",
"gap": 8.494060363839935,
"focus": 0.638860204272362
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
119.89725588382038,
-182.80633248319418
]
]
},
{
"type": "text",
"version": 153,
"versionNonce": 237063867,
"isDeleted": false,
"id": "ldwMpBOP",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -396.2817327105809,
"y": -542.932609830584,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 55,
"height": 32,
"seed": 1933563760,
"groupIds": [
"3DU_neE53AK_BgW75ciL-"
],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"fontSize": 28,
"fontFamily": 4,
"text": "生成",
"rawText": "生成",
"baseline": 26,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "生成"
},
{
"type": "rectangle",
"version": 135,
"versionNonce": 516051344,
"isDeleted": false,
"id": "bAE6BlzW07mkD6QXu46yS",
"fillStyle": "cross-hatch",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -398.66662597656244,
"y": 218.83332633972168,
"strokeColor": "#2b8a3e",
"backgroundColor": "#ced4da",
"width": 400,
"height": 125,
"seed": 1121949584,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "fR1wmS0i",
"type": "text"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 113,
"versionNonce": 1291220880,
"isDeleted": false,
"id": "fR1wmS0i",
"fillStyle": "cross-hatch",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -393.66662597656244,
"y": 265.3333263397217,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"width": 390,
"height": 32,
"seed": 238250352,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979838,
"link": null,
"fontSize": 28.041113496351873,
"fontFamily": 4,
"text": "efuse",
"rawText": "efuse",
"baseline": 26,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "bAE6BlzW07mkD6QXu46yS",
"originalText": "efuse"
},
{
"type": "rectangle",
"version": 291,
"versionNonce": 1651593072,
"isDeleted": false,
"id": "HzboBQfksE7EmYMVvFf4M",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -374.0000610351562,
"y": 236.8333568572998,
"strokeColor": "#a61e4d",
"backgroundColor": "#868e96",
"width": 111,
"height": 33,
"seed": 807806352,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "9mi1XEAK",
"type": "text"
}
],
"updated": 1650249979838,
"link": null
},
{
"type": "text",
"version": 282,
"versionNonce": 341902736,
"isDeleted": false,
"id": "9mi1XEAK",
"fillStyle": "cross-hatch",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -369.0000610351562,
"y": 241.8333568572998,
"strokeColor": "#a61e4d",
"backgroundColor": "#868e96",
"width": 101,
"height": 23,
"seed": 1759820656,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1650249979838,
"link": null,
"fontSize": 20,
"fontFamily": 4,
"text": "root pub key hash",
"rawText": "root pub key hash",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "HzboBQfksE7EmYMVvFf4M",
"originalText": "root pub key hash"
},
{
"type": "line",
"version": 92,
"versionNonce": 1186726971,
"isDeleted": false,
"id": "fJXjk4tnnvDjJMwdk2Bol",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -229.3333129882812,
"y": 114.83332633972168,
"strokeColor": "#2b8a3e",
"backgroundColor": "#ced4da",
"width": 78.66668701171875,
"height": 120.66668701171875,
"seed": 292221840,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1650249979837,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
-78.66668701171875,
120.66668701171875
]
]
}
],
"appState": {
"theme": "light",
"viewBackgroundColor": "#ffffff",
"currentItemStrokeColor": "#000000",
"currentItemBackgroundColor": "transparent",
"currentItemFillStyle": "hachure",
"currentItemStrokeWidth": 1,
"currentItemStrokeStyle": "solid",
"currentItemRoughness": 1,
"currentItemOpacity": 100,
"currentItemFontFamily": 1,
"currentItemFontSize": 20,
"currentItemTextAlign": "left",
"currentItemStrokeSharpness": "sharp",
"currentItemStartArrowhead": null,
"currentItemEndArrowhead": "arrow",
"currentItemLinearStrokeSharpness": "round",
"gridSize": null,
"colorPalette": {}
},
"files": {}
}

%%

==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Text Elements

加密狗服务端 ^XXKuYfge

产线内置签名
工具客户端 ^tFpvqeqf

rsa key pair ^sNovGCmk

算法库 (RO) ^PkCbIwNh

设备端 ^nPGQJj74

加密狗 ^2HZkMI7M

算法库的hash传给加密狗 ^j1ddg0Xg

生成算法库文件hash的签名footer ^OtsyqD8R

footer中包含了 rsa pubkey 及 signature ^9a59WrMj

使用 uuid 封装
的key 加密footer ^GgM5c3Tj

将footer 传回设备端 ^Yvwr100a

rsa pubkey
hash (RO) ^2RfJQLh0

产线阶段 ^a40bfXPR

算法库运行 ^Nxa2ikaU

get_uuid 读取footer

使用uuid封装的key 解密footer ^x0CYqDV1

uuid 传给加密狗 ^SrlRzbtx

uuid 及当前的授权计数
存在加密狗内部ROM ^iabbZudh

从footer 中 找到 rsa pubkey signature

对pubkey 计算hash, 跟设备中预置的 rsa pubkey hash 比对
如不一致, 算法退出 ^eETAeDlY

boot.img ^yj3fXU3M

使用pubkey 验签signature, 验签失败, 算法退出 ^pfR3xgiI

get_uuid ^GIh2OasG

ROM ^FA3NVFnk

PC端 ^odSrtb6x

导出uuid 及 计数 ^oEu1kANa

读取算法库 ^9dhB7FTA

usb ^zQ4icBNY

usb ^DzSi5bix

读取设备中
预置的rsa pubkey
的hash ^3xmOGvAn

计算算法库hash ^Q9pFueLF

写入footer文件 ^WgTiF1h8

system.img ^GRFhiEk8

footer
(RW) ^TL8J8Bp4

%%

Drawing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "hP8UXH03ZqclpqXWcuGtv",
"type": "rectangle",
"x": -359.08430262575314,
"y": 212.19023256010496,
"width": 94.99999999999991,
"height": 100.00000000000013,
"angle": 0,
"strokeColor": "#e67700",
"backgroundColor": "#868e96",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 1842220695,
"version": 140,
"versionNonce": 1942617175,
"isDeleted": false,
"boundElements": null,
"updated": 1658730320740,
"link": null
},
{
"type": "rectangle",
"version": 359,
"versionNonce": 938634137,
"isDeleted": false,
"id": "Z8DEp5CCsLRA1Kyru5ehn",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -366.66666666666663,
"y": -211.1666717529297,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 268.5,
"height": 124.33333333333333,
"seed": 1868393977,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730164244,
"link": null
},
{
"type": "rectangle",
"version": 538,
"versionNonce": 81167097,
"isDeleted": false,
"id": "WjZQr-0R9mZNO4Ci2hSiV",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -391.5,
"y": -233.5,
"strokeColor": "#364fc7",
"backgroundColor": "transparent",
"width": 314,
"height": 877.5555555555554,
"seed": 29027799,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "CB9KBAWnRv4-rNdZMC0rf",
"type": "arrow"
}
],
"updated": 1658730524153,
"link": null
},
{
"type": "rectangle",
"version": 353,
"versionNonce": 1421409177,
"isDeleted": false,
"id": "nCZYE4TzEhsJNQyBJqAtP",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -11.5,
"y": -229.5,
"strokeColor": "#364fc7",
"backgroundColor": "transparent",
"width": 302,
"height": 553,
"seed": 1740095991,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null
},
{
"type": "text",
"version": 298,
"versionNonce": 739829367,
"isDeleted": false,
"id": "XXKuYfge",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 40.5,
"y": -104.5,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 121,
"height": 28,
"seed": 1491865751,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 20,
"fontFamily": 1,
"text": "加密狗服务端",
"rawText": "加密狗服务端",
"baseline": 21,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "加密狗服务端"
},
{
"type": "text",
"version": 791,
"versionNonce": 1797791865,
"isDeleted": false,
"id": "tFpvqeqf",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -359.5,
"y": -71.5,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 120,
"height": 56,
"seed": 979275735,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 20,
"fontFamily": 1,
"text": "产线内置签名\n工具客户端",
"rawText": "产线内置签名\n工具客户端",
"baseline": 49,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "产线内置签名\n工具客户端"
},
{
"type": "rectangle",
"version": 328,
"versionNonce": 1396899735,
"isDeleted": false,
"id": "Xc9L7o5vXSrNKctRL93Bu",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 38.5,
"y": -210.5,
"strokeColor": "#000000",
"backgroundColor": "#fa5252",
"width": 203,
"height": 56,
"seed": 492261175,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"type": "text",
"id": "sNovGCmk"
}
],
"updated": 1658729755721,
"link": null
},
{
"type": "text",
"version": 339,
"versionNonce": 908044633,
"isDeleted": false,
"id": "sNovGCmk",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 43.5,
"y": -195,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 193,
"height": 25,
"seed": 340395639,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 20,
"fontFamily": 1,
"text": "rsa key pair",
"rawText": "rsa key pair",
"baseline": 18,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "Xc9L7o5vXSrNKctRL93Bu",
"originalText": "rsa key pair"
},
{
"type": "rectangle",
"version": 429,
"versionNonce": 2081223863,
"isDeleted": false,
"id": "pQ5LlzEDP7qyYoTBEw213",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -210.5,
"y": -151.5,
"strokeColor": "#d9480f",
"backgroundColor": "#228be6",
"width": 96,
"height": 60,
"seed": 1109068375,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"type": "text",
"id": "PkCbIwNh"
}
],
"updated": 1658729755721,
"link": null
},
{
"type": "text",
"version": 424,
"versionNonce": 1570675865,
"isDeleted": false,
"id": "PkCbIwNh",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -205.5,
"y": -146.5,
"strokeColor": "#d9480f",
"backgroundColor": "#fa5252",
"width": 86,
"height": 50,
"seed": 1926819737,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730122001,
"link": null,
"fontSize": 20,
"fontFamily": 1,
"text": "算法库 \n(RO)",
"rawText": "算法库 (RO)",
"baseline": 43,
"textAlign": "left",
"verticalAlign": "top",
"containerId": "pQ5LlzEDP7qyYoTBEw213",
"originalText": "算法库 (RO)"
},
{
"type": "rectangle",
"version": 583,
"versionNonce": 505103831,
"isDeleted": false,
"id": "08SlPcgX1LaQanVnOUJfx",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 86.5,
"y": -65.5,
"strokeColor": "#5c940d",
"backgroundColor": "#40c057",
"width": 35,
"height": 376,
"seed": 95374457,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "AMXYY7OsbPqFKpxY1mI0S",
"type": "arrow"
},
{
"id": "uBtvbIVyvMl9xQbG28sxK",
"type": "arrow"
},
{
"id": "t0LToGHbRojl5xSC6ZvKy",
"type": "arrow"
},
{
"id": "xy6yLRLPotFd-dsgCCWsT",
"type": "arrow"
},
{
"id": "5orK2Xq5r9Rqf0wkQrkCA",
"type": "arrow"
}
],
"updated": 1658729755721,
"link": null
},
{
"type": "rectangle",
"version": 543,
"versionNonce": 1263655383,
"isDeleted": false,
"id": "sCavNl5y82xK5KX398rB2",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -248.5,
"y": -53.5,
"strokeColor": "#5f3dc4",
"backgroundColor": "#4c6ef5",
"width": 26,
"height": 358,
"seed": 907028375,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "AMXYY7OsbPqFKpxY1mI0S",
"type": "arrow"
},
{
"id": "t0LToGHbRojl5xSC6ZvKy",
"type": "arrow"
},
{
"id": "SQqfg9ohU0cdC-iIoaywV",
"type": "arrow"
},
{
"id": "7o-ng0eFxWQMXaR1-IIka",
"type": "arrow"
},
{
"id": "O5EyTSSCFZYEnESQttKh3",
"type": "arrow"
},
{
"id": "1UyMINLRmpQDumHWMuphM",
"type": "arrow"
},
{
"id": "ckXkAy08rpz7UxCQqdQPm",
"type": "arrow"
},
{
"id": "kxMMJc3kzWJr9SmVqtGd3",
"type": "arrow"
}
],
"updated": 1658730356022,
"link": null
},
{
"type": "text",
"version": 259,
"versionNonce": 1216508663,
"isDeleted": false,
"id": "nPGQJj74",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -304.5,
"y": -275.5,
"strokeColor": "#5f3dc4",
"backgroundColor": "#4c6ef5",
"width": 61,
"height": 28,
"seed": 2046394551,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 20,
"fontFamily": 1,
"text": "设备端",
"rawText": "设备端",
"baseline": 21,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "设备端"
},
{
"type": "text",
"version": 211,
"versionNonce": 1296800761,
"isDeleted": false,
"id": "2HZkMI7M",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 124.5,
"y": -276.5,
"strokeColor": "#5f3dc4",
"backgroundColor": "#4c6ef5",
"width": 61,
"height": 28,
"seed": 289103321,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 20,
"fontFamily": 1,
"text": "加密狗",
"rawText": "加密狗",
"baseline": 21,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "加密狗"
},
{
"type": "arrow",
"version": 1264,
"versionNonce": 868678679,
"isDeleted": false,
"id": "AMXYY7OsbPqFKpxY1mI0S",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -218.02136405517012,
"y": 8.626428137368407,
"strokeColor": "#000000",
"backgroundColor": "#4c6ef5",
"width": 301.80450575068653,
"height": 0,
"seed": 562697815,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"startBinding": {
"elementId": "sCavNl5y82xK5KX398rB2",
"focus": -0.6529249824728021,
"gap": 4.478635944829875
},
"endBinding": {
"elementId": "08SlPcgX1LaQanVnOUJfx",
"focus": 0.6057104886310192,
"gap": 2.716858304483594
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
301.80450575068653,
0
]
]
},
{
"type": "text",
"version": 268,
"versionNonce": 222803161,
"isDeleted": false,
"id": "j1ddg0Xg",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -141.78571428571422,
"y": -22.142857142857167,
"strokeColor": "#000000",
"backgroundColor": "#4c6ef5",
"width": 180,
"height": 23,
"seed": 2051143575,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "算法库的hash传给加密狗",
"rawText": "算法库的hash传给加密狗",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "算法库的hash传给加密狗"
},
{
"type": "text",
"version": 568,
"versionNonce": 333275447,
"isDeleted": false,
"id": "OtsyqD8R",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 152.357142857143,
"y": 32.21428571428572,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 246,
"height": 23,
"seed": 254102647,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "生成算法库文件hash的签名footer",
"rawText": "生成算法库文件hash的签名footer",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "生成算法库文件hash的签名footer"
},
{
"type": "text",
"version": 481,
"versionNonce": 739094969,
"isDeleted": false,
"id": "9a59WrMj",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 152.49999999999977,
"y": 57.928571428571445,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 311,
"height": 23,
"seed": 1028129945,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "footer中包含了 rsa pubkey 及 signature",
"rawText": "footer中包含了 rsa pubkey 及 signature",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "footer中包含了 rsa pubkey 及 signature"
},
{
"type": "text",
"version": 978,
"versionNonce": 707404375,
"isDeleted": false,
"id": "GgM5c3Tj",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dotted",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 145.78571428571456,
"y": 117.21428571428572,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 131,
"height": 46,
"seed": 1928426649,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "SQqfg9ohU0cdC-iIoaywV",
"type": "arrow"
},
{
"id": "5orK2Xq5r9Rqf0wkQrkCA",
"type": "arrow"
}
],
"updated": 1658729755721,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "使用 uuid 封装\n的key 加密footer",
"rawText": "使用 uuid 封装\n的key 加密footer",
"baseline": 40,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "使用 uuid 封装\n的key 加密footer"
},
{
"type": "arrow",
"version": 930,
"versionNonce": 2126582425,
"isDeleted": false,
"id": "t0LToGHbRojl5xSC6ZvKy",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 83.7642640721961,
"y": 224.12095293992866,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 302.54997835791033,
"height": 0,
"seed": 1784576087,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1658729755721,
"link": null,
"startBinding": {
"elementId": "08SlPcgX1LaQanVnOUJfx",
"focus": -0.5405369837230247,
"gap": 2.7357359278039013
},
"endBinding": {
"elementId": "sCavNl5y82xK5KX398rB2",
"focus": 0.5509550443571434,
"gap": 3.7142857142857792
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
-302.54997835791033,
0
]
]
},
{
"type": "rectangle",
"version": 507,
"versionNonce": 394379127,
"isDeleted": false,
"id": "zyu7tv6aalSycLElFajoM",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -533.5,
"y": -224.1666717529297,
"strokeColor": "#2b8a3e",
"backgroundColor": "transparent",
"width": 941,
"height": 566,
"seed": 1584581303,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755721,
"link": null
},
{
"type": "text",
"version": 337,
"versionNonce": 1779783545,
"isDeleted": false,
"id": "Yvwr100a",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -128.64285714285722,
"y": 200.21428571428567,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 155,
"height": 23,
"seed": 1568522487,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "t0LToGHbRojl5xSC6ZvKy",
"type": "arrow"
}
],
"updated": 1658729755721,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "将footer 传回设备端",
"rawText": "将footer 传回设备端",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "将footer 传回设备端"
},
{
"type": "rectangle",
"version": 460,
"versionNonce": 1202155767,
"isDeleted": false,
"id": "TceHCkLBSMCTnj9YocOl5",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -351.07142857142856,
"y": -186.21428571428572,
"strokeColor": "#000000",
"backgroundColor": "#be4bdb",
"width": 91,
"height": 90,
"seed": 586018745,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"type": "text",
"id": "2RfJQLh0"
}
],
"updated": 1658730329121,
"link": null
},
{
"type": "text",
"version": 374,
"versionNonce": 1000004695,
"isDeleted": false,
"id": "2RfJQLh0",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -346.07142857142856,
"y": -181.21428571428572,
"strokeColor": "#000000",
"backgroundColor": "#be4bdb",
"width": 81,
"height": 80,
"seed": 928992407,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730140916,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "rsa \npubkey\n hash \n(RO)",
"rawText": "rsa pubkey\n hash (RO)",
"baseline": 74,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "TceHCkLBSMCTnj9YocOl5",
"originalText": "rsa pubkey\n hash (RO)"
},
{
"type": "text",
"version": 222,
"versionNonce": 64196023,
"isDeleted": false,
"id": "a40bfXPR",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -524.5,
"y": -220.1666717529297,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 65,
"height": 23,
"seed": 865658969,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "产线阶段",
"rawText": "产线阶段",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "产线阶段"
},
{
"type": "rectangle",
"version": 349,
"versionNonce": 2134805817,
"isDeleted": false,
"id": "Q-3iZLuaQPlTwhELJEUGF",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -290.5,
"y": 374.8333282470703,
"strokeColor": "#000000",
"backgroundColor": "#228be6",
"width": 24.000000000000007,
"height": 240.11111111111126,
"seed": 1383732985,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null
},
{
"type": "rectangle",
"version": 333,
"versionNonce": 61259479,
"isDeleted": false,
"id": "hSyt7KqEIpCraWaaS3ttt",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -534.5,
"y": 341.8333282470703,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 946,
"height": 320.2222222222222,
"seed": 1849952889,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null
},
{
"type": "text",
"version": 211,
"versionNonce": 2118811161,
"isDeleted": false,
"id": "Nxa2ikaU",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -515.5,
"y": 344.8333282470703,
"strokeColor": "#000000",
"backgroundColor": "transparent",
"width": 81,
"height": 23,
"seed": 1858554807,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "算法库运行",
"rawText": "算法库运行",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "算法库运行"
},
{
"type": "text",
"version": 299,
"versionNonce": 1338757049,
"isDeleted": false,
"id": "x0CYqDV1",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -248.5,
"y": 374.8333282470703,
"strokeColor": "#000000",
"backgroundColor": "#228be6",
"width": 226,
"height": 66,
"seed": 1178899641,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730548244,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "get_uuid 读取footer\n\n使用uuid封装的key 解密footer",
"rawText": "get_uuid 读取footer\n\n使用uuid封装的key 解密footer",
"baseline": 60,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "get_uuid 读取footer\n\n使用uuid封装的key 解密footer"
},
{
"type": "arrow",
"version": 670,
"versionNonce": 632363863,
"isDeleted": false,
"id": "SQqfg9ohU0cdC-iIoaywV",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": -218.38235294117646,
"y": 118.94628173563513,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 306.5205750340866,
"height": 0,
"seed": 1413889753,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"startBinding": {
"elementId": "sCavNl5y82xK5KX398rB2",
"focus": -0.036612951197569125,
"gap": 4.117647058823536
},
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
306.5205750340866,
0
]
]
},
{
"type": "text",
"version": 208,
"versionNonce": 503458201,
"isDeleted": false,
"id": "SrlRzbtx",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -133.5,
"y": 93.83332824707031,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 120,
"height": 23,
"seed": 244954647,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "uuid 传给加密狗",
"rawText": "uuid 传给加密狗",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "uuid 传给加密狗"
},
{
"type": "text",
"version": 501,
"versionNonce": 1505859703,
"isDeleted": false,
"id": "iabbZudh",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -68.5,
"y": 274.8333282470703,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 167,
"height": 46,
"seed": 1022229657,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "t0LToGHbRojl5xSC6ZvKy",
"type": "arrow"
}
],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "uuid 及当前的授权计数\n存在加密狗内部ROM",
"rawText": "uuid 及当前的授权计数\n存在加密狗内部ROM",
"baseline": 40,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "uuid 及当前的授权计数\n存在加密狗内部ROM"
},
{
"type": "text",
"version": 357,
"versionNonce": 1327206009,
"isDeleted": false,
"id": "eETAeDlY",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -246.5,
"y": 462.8333282470703,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 439,
"height": 89,
"seed": 933484569,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "从footer 中 找到 rsa pubkey signature\n\n对pubkey 计算hash, 跟设备中预置的 rsa pubkey hash 比对\n如不一致, 算法退出",
"rawText": "从footer 中 找到 rsa pubkey signature\n\n对pubkey 计算hash, 跟设备中预置的 rsa pubkey hash 比对\n如不一致, 算法退出",
"baseline": 83,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "从footer 中 找到 rsa pubkey signature\n\n对pubkey 计算hash, 跟设备中预置的 rsa pubkey hash 比对\n如不一致, 算法退出"
},
{
"type": "text",
"version": 250,
"versionNonce": 1829073303,
"isDeleted": false,
"id": "yj3fXU3M",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -362.5,
"y": -210.1666717529297,
"strokeColor": "#000000",
"backgroundColor": "#82c91e",
"width": 62,
"height": 20,
"seed": 971658039,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "boot.img",
"rawText": "boot.img",
"baseline": 14,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "boot.img"
},
{
"type": "text",
"version": 308,
"versionNonce": 1488004791,
"isDeleted": false,
"id": "pfR3xgiI",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -245.5,
"y": 569.8333282470703,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 347,
"height": 23,
"seed": 1255549881,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "使用pubkey 验签signature, 验签失败, 算法退出",
"rawText": "使用pubkey 验签signature, 验签失败, 算法退出",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "使用pubkey 验签signature, 验签失败, 算法退出"
},
{
"type": "arrow",
"version": 364,
"versionNonce": 593691705,
"isDeleted": false,
"id": "Ds2IFBCGtLQpjWU2hJNm4",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -223.66235334713616,
"y": 46.06098071156484,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 20,
"height": 35.21739130434784,
"seed": 1680702679,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
19.565217391304316,
0
],
[
19.565217391304316,
35.21739130434784
],
[
-0.4347826086956843,
33.913043478260875
]
]
},
{
"type": "arrow",
"version": 416,
"versionNonce": 2070493143,
"isDeleted": false,
"id": "xy6yLRLPotFd-dsgCCWsT",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 125.62336093857806,
"y": 40.346694997279116,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 20,
"height": 35.21739130434784,
"seed": 1159876887,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"startBinding": {
"elementId": "08SlPcgX1LaQanVnOUJfx",
"focus": -0.4369856649080899,
"gap": 4.12336093857806
},
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
19.565217391304316,
0
],
[
19.565217391304316,
35.21739130434784
],
[
-0.4347826086956843,
33.913043478260875
]
]
},
{
"type": "arrow",
"version": 690,
"versionNonce": 885527833,
"isDeleted": false,
"id": "O5EyTSSCFZYEnESQttKh3",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -218.66235334713616,
"y": -40.36759071700661,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 20,
"height": 35.21739130434784,
"seed": 221294233,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"startBinding": {
"elementId": "sCavNl5y82xK5KX398rB2",
"focus": -0.9266345850112101,
"gap": 3.837646652863839
},
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
19.565217391304316,
0
],
[
19.565217391304316,
35.21739130434784
],
[
-0.4347826086956843,
33.913043478260875
]
]
},
{
"type": "arrow",
"version": 628,
"versionNonce": 1799496951,
"isDeleted": false,
"id": "1UyMINLRmpQDumHWMuphM",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -217.94806763285038,
"y": 251.06098071156484,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 20,
"height": 35.21739130434784,
"seed": 2061287225,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"startBinding": {
"elementId": "sCavNl5y82xK5KX398rB2",
"focus": 0.7014579928020384,
"gap": 4.551932367149618
},
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
19.565217391304316,
0
],
[
19.565217391304316,
35.21739130434784
],
[
-0.4347826086956843,
33.913043478260875
]
]
},
{
"type": "text",
"version": 207,
"versionNonce": 2098727417,
"isDeleted": false,
"id": "GIh2OasG",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -196.25793650793662,
"y": 47.16277505248968,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 71,
"height": 20,
"seed": 1513770327,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "get_uuid",
"rawText": "get_uuid",
"baseline": 14,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "get_uuid"
},
{
"type": "rectangle",
"version": 259,
"versionNonce": 130051607,
"isDeleted": false,
"id": "62QYbMPlpFFIuxKT9UY_o",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 215.96428571428555,
"y": 265.27388616360065,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 60,
"height": 50,
"seed": 1807009495,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"type": "text",
"id": "FA3NVFnk"
},
{
"id": "uBtvbIVyvMl9xQbG28sxK",
"type": "arrow"
}
],
"updated": 1658729755722,
"link": null
},
{
"type": "text",
"version": 231,
"versionNonce": 626418393,
"isDeleted": false,
"id": "FA3NVFnk",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 220.96428571428555,
"y": 280.27388616360065,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 50,
"height": 20,
"seed": 1757750297,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "ROM",
"rawText": "ROM",
"baseline": 14,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "62QYbMPlpFFIuxKT9UY_o",
"originalText": "ROM"
},
{
"type": "arrow",
"version": 404,
"versionNonce": 1073757015,
"isDeleted": false,
"id": "uBtvbIVyvMl9xQbG28sxK",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 122.5,
"y": 289.0852758766034,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 91.24206349206338,
"height": 1.2529285456468529,
"seed": 805090935,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730244365,
"link": null,
"startBinding": {
"elementId": "08SlPcgX1LaQanVnOUJfx",
"gap": 1,
"focus": 0.8836111492658449
},
"endBinding": {
"elementId": "62QYbMPlpFFIuxKT9UY_o",
"gap": 2.2222222222221717,
"focus": -0.019943019943019526
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
91.24206349206338,
1.2529285456468529
]
]
},
{
"type": "rectangle",
"version": 767,
"versionNonce": 825935225,
"isDeleted": false,
"id": "QZ746HEYDtj5HeflKvMY2",
"fillStyle": "hachure",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"angle": 0,
"x": 253.93101266234146,
"y": 165.98690428333873,
"strokeColor": "#862e9c",
"backgroundColor": "#fab005",
"width": 24.285714285714334,
"height": 75.99999999999994,
"seed": 2092396281,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "AMXYY7OsbPqFKpxY1mI0S",
"type": "arrow"
},
{
"id": "SQqfg9ohU0cdC-iIoaywV",
"type": "arrow"
},
{
"id": "uBtvbIVyvMl9xQbG28sxK",
"type": "arrow"
},
{
"id": "GLJCoXiZo9sTMK7MAvNN9",
"type": "arrow"
},
{
"id": "pCa8wrkxX_qrfOhWrTl91",
"type": "arrow"
}
],
"updated": 1658729755722,
"link": null
},
{
"type": "arrow",
"version": 766,
"versionNonce": 489470071,
"isDeleted": false,
"id": "GLJCoXiZo9sTMK7MAvNN9",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 2,
"opacity": 40,
"angle": 0,
"x": 280.90455763588665,
"y": 216.60410392507754,
"strokeColor": "#862e9c",
"backgroundColor": "#fab005",
"width": 213.44481191444953,
"height": 1.0070417098924622,
"seed": 1167799255,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730244368,
"link": null,
"startBinding": {
"elementId": "QZ746HEYDtj5HeflKvMY2",
"gap": 2.687830687830825,
"focus": 0.3333703289436518
},
"endBinding": {
"elementId": "5GsFPS3G1cybCgfrNsxBJ",
"gap": 5.811801842164073,
"focus": -0.2953642337336612
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
213.44481191444953,
-1.0070417098924622
]
]
},
{
"type": "arrow",
"version": 345,
"versionNonce": 1284877913,
"isDeleted": false,
"id": "pCa8wrkxX_qrfOhWrTl91",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 253.51417966151973,
"y": 265.44319833291286,
"strokeColor": "#862e9c",
"backgroundColor": "#fab005",
"width": 0.43484595545382376,
"height": 19.81343690671713,
"seed": 1673896471,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"startBinding": null,
"endBinding": {
"elementId": "QZ746HEYDtj5HeflKvMY2",
"focus": 0.8639163289886465,
"gap": 3.6428571428570535
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
0.43484595545382376,
-19.81343690671713
]
]
},
{
"type": "text",
"version": 281,
"versionNonce": 866500535,
"isDeleted": false,
"id": "oEu1kANa",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 289.28815551948435,
"y": 217.70118999762428,
"strokeColor": "#862e9c",
"backgroundColor": "#fab005",
"width": 128,
"height": 23,
"seed": 789297913,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "GLJCoXiZo9sTMK7MAvNN9",
"type": "arrow"
}
],
"updated": 1658729755722,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "导出uuid 及 计数",
"rawText": "导出uuid 及 计数",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "导出uuid 及 计数"
},
{
"type": "rectangle",
"version": 324,
"versionNonce": 308312889,
"isDeleted": false,
"id": "5GsFPS3G1cybCgfrNsxBJ",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 500.16117139250025,
"y": 156.44722174365586,
"strokeColor": "#2b8a3e",
"backgroundColor": "#ced4da",
"width": 60,
"height": 91,
"seed": 298925017,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "GLJCoXiZo9sTMK7MAvNN9",
"type": "arrow"
},
{
"type": "text",
"id": "odSrtb6x"
}
],
"updated": 1658729755722,
"link": null
},
{
"type": "text",
"version": 287,
"versionNonce": 1419535961,
"isDeleted": false,
"id": "odSrtb6x",
"fillStyle": "solid",
"strokeWidth": 4,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 505.16117139250025,
"y": 191.94722174365586,
"strokeColor": "#2b8a3e",
"backgroundColor": "#fab005",
"width": 50,
"height": 20,
"seed": 1942388727,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730140920,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "PC端",
"rawText": "PC端",
"baseline": 14,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "5GsFPS3G1cybCgfrNsxBJ",
"originalText": "PC端"
},
{
"type": "arrow",
"version": 473,
"versionNonce": 84321367,
"isDeleted": false,
"id": "7o-ng0eFxWQMXaR1-IIka",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -192.83007896339063,
"y": -86.16977527876759,
"strokeColor": "#364fc7",
"backgroundColor": "transparent",
"width": 25.285714285714334,
"height": 43.928571428571445,
"seed": 2066690999,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1658730171116,
"link": null,
"startBinding": {
"elementId": "9dhB7FTA",
"focus": 0.8027659083887505,
"gap": 1
},
"endBinding": {
"elementId": "sCavNl5y82xK5KX398rB2",
"focus": -0.6822928351784449,
"gap": 4.384206750895032
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
-25.285714285714334,
43.928571428571445
]
]
},
{
"type": "text",
"version": 170,
"versionNonce": 1282281401,
"isDeleted": false,
"id": "9dhB7FTA",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -202.2885076437874,
"y": -85.8833755197636,
"strokeColor": "#364fc7",
"backgroundColor": "transparent",
"width": 81,
"height": 23,
"seed": 1309870425,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "ckXkAy08rpz7UxCQqdQPm",
"type": "arrow"
},
{
"id": "7o-ng0eFxWQMXaR1-IIka",
"type": "arrow"
}
],
"updated": 1658730171116,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "读取算法库",
"rawText": "读取算法库",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "读取算法库"
},
{
"type": "line",
"version": 1677,
"versionNonce": 437467609,
"isDeleted": false,
"id": "fMkRSW8qWgibW0LfPeoky",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 30,
"angle": 0,
"x": -80.52631578947364,
"y": 38.9473684210526,
"strokeColor": "#40c057",
"backgroundColor": "#40c057",
"width": 101.77419354838707,
"height": 60,
"seed": 936921337,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755722,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
60,
0
],
[
60,
-20
],
[
81.12903225806451,
12.258064516129025
],
[
60,
40
],
[
60,
20
],
[
0,
20
],
[
0,
40
],
[
-20.645161290322562,
10.16129032258064
],
[
0,
-20
],
[
0,
0
]
]
},
{
"type": "text",
"version": 149,
"versionNonce": 792243255,
"isDeleted": false,
"id": "zQ4icBNY",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 30,
"angle": 0,
"x": -65.66163334442683,
"y": 38.05492192149808,
"strokeColor": "#40c057",
"backgroundColor": "#40c057",
"width": 27,
"height": 20,
"seed": 363522583,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755723,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "usb",
"rawText": "usb",
"baseline": 14,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "usb"
},
{
"type": "line",
"version": 1788,
"versionNonce": 2132842169,
"isDeleted": false,
"id": "gwRe7ylC_dvFJCxuVmaNH",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 30,
"angle": 0,
"x": 329.5700392542438,
"y": 177.072465781147,
"strokeColor": "#40c057",
"backgroundColor": "#40c057",
"width": 208.20276497695852,
"height": 60,
"seed": 434048217,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755723,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": null,
"points": [
[
0,
0
],
[
122.74394385329413,
0
],
[
122.74394385329413,
-20
],
[
165.9682896725993,
12.258064516129025
],
[
122.74394385329413,
40
],
[
122.74394385329413,
20
],
[
0,
20
],
[
0,
40
],
[
-42.23447530435923,
10.16129032258064
],
[
0,
-20
],
[
0,
0
]
]
},
{
"type": "text",
"version": 236,
"versionNonce": 1910771031,
"isDeleted": false,
"id": "DzSi5bix",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 30,
"angle": 0,
"x": 374.72266072407797,
"y": 175.32643403511543,
"strokeColor": "#40c057",
"backgroundColor": "#40c057",
"width": 27,
"height": 20,
"seed": 635694935,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755723,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "usb",
"rawText": "usb",
"baseline": 14,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "usb"
},
{
"type": "arrow",
"version": 539,
"versionNonce": 1830743865,
"isDeleted": false,
"id": "sAjXoQQhu2Oaxp7cknzI8",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -336.40897685859665,
"y": -99.6771807345822,
"strokeColor": "#40c057",
"backgroundColor": "#40c057",
"width": 140.7432334927367,
"height": 623.0952380952381,
"seed": 409804535,
"groupIds": [],
"strokeSharpness": "round",
"boundElements": [],
"updated": 1658730336726,
"link": null,
"startBinding": null,
"endBinding": null,
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
-2.600808200450288,
0
],
[
-47.410297208763474,
375.95238095238096
],
[
93.33293628397323,
623.0952380952381
]
]
},
{
"type": "text",
"version": 335,
"versionNonce": 1187400311,
"isDeleted": false,
"id": "3xmOGvAn",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -400.2188977174807,
"y": 339.98948593208445,
"strokeColor": "#40c057",
"backgroundColor": "#40c057",
"width": 131,
"height": 69,
"seed": 648683769,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [
{
"id": "ckXkAy08rpz7UxCQqdQPm",
"type": "arrow"
}
],
"updated": 1658729755723,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "读取设备中\n预置的rsa pubkey\n的hash",
"rawText": "读取设备中\n预置的rsa pubkey\n的hash",
"baseline": 63,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "读取设备中\n预置的rsa pubkey\n的hash"
},
{
"type": "text",
"version": 157,
"versionNonce": 661847161,
"isDeleted": false,
"id": "Q9pFueLF",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -193.80325828235186,
"y": -47.43651047963942,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 116,
"height": 23,
"seed": 406793081,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755723,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "计算算法库hash",
"rawText": "计算算法库hash",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "计算算法库hash"
},
{
"type": "text",
"version": 149,
"versionNonce": 1265705753,
"isDeleted": false,
"id": "WgTiF1h8",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": -195.94611542520897,
"y": 253.27777523464624,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"width": 115,
"height": 23,
"seed": 1348566105,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658730261233,
"link": null,
"fontSize": 16,
"fontFamily": 1,
"text": "写入footer文件",
"rawText": "写入footer文件",
"baseline": 17,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "写入footer文件"
},
{
"type": "arrow",
"version": 691,
"versionNonce": 1554974041,
"isDeleted": false,
"id": "5orK2Xq5r9Rqf0wkQrkCA",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"angle": 0,
"x": 124.19571696558552,
"y": 161.06141468854364,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"width": 24.571428571428555,
"height": 36.218685002544845,
"seed": 531000153,
"groupIds": [],
"strokeSharpness": "sharp",
"boundElements": [],
"updated": 1658729755723,
"link": null,
"startBinding": {
"elementId": "08SlPcgX1LaQanVnOUJfx",
"focus": 0.20411714563686495,
"gap": 2.695716965585518
},
"endBinding": {
"elementId": "08SlPcgX1LaQanVnOUJfx",
"focus": 0.39978546204825843,
"gap": 1
},
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"points": [
[
0,
0
],
[
22.715310466348512,
0.17909346535728332
],
[
22.715310466348512,
35.396484769705125
],
[
-1.8561181050800428,
36.218685002544845
]
]
},
{
"id": "GRFhiEk8",
"type": "text",
"x": -355.7509692924197,
"y": 217.69023256010496,
"width": 80,
"height": 20,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#40c057",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 451092057,
"version": 87,
"versionNonce": 898018713,
"isDeleted": false,
"boundElements": null,
"updated": 1658730216287,
"link": null,
"text": "system.img",
"rawText": "system.img",
"fontSize": 16,
"fontFamily": 1,
"textAlign": "left",
"verticalAlign": "top",
"baseline": 14,
"containerId": null,
"originalText": "system.img"
},
{
"id": "Zrd_PdsDwnbpex4pQ1P-h",
"type": "rectangle",
"x": -344.9176359590864,
"y": 252.19023256010496,
"width": 70.00000000000006,
"height": 50,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#7950f2",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 513845783,
"version": 44,
"versionNonce": 787879735,
"isDeleted": false,
"boundElements": [
{
"type": "text",
"id": "TL8J8Bp4"
}
],
"updated": 1658730297720,
"link": null
},
{
"id": "TL8J8Bp4",
"type": "text",
"x": -339.9176359590864,
"y": 257.19023256010496,
"width": 60.00000000000006,
"height": 40,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#7950f2",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "sharp",
"seed": 2107195991,
"version": 37,
"versionNonce": 1787747033,
"isDeleted": false,
"boundElements": null,
"updated": 1658730425417,
"link": null,
"text": "footer\n(RW)",
"rawText": "footer\n(RW)",
"fontSize": 16.00000000000007,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "middle",
"baseline": 34,
"containerId": "Zrd_PdsDwnbpex4pQ1P-h",
"originalText": "footer\n(RW)"
},
{
"id": "kxMMJc3kzWJr9SmVqtGd3",
"type": "arrow",
"x": -219.08430262575303,
"y": 286.3568992267717,
"width": 58.33333333333337,
"height": 2.5,
"angle": 0,
"strokeColor": "#000000",
"backgroundColor": "#868e96",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 1439604761,
"version": 80,
"versionNonce": 969311991,
"isDeleted": false,
"boundElements": null,
"updated": 1658730359198,
"link": null,
"points": [
[
0,
0
],
[
-58.33333333333337,
-2.5
]
],
"lastCommittedPoint": [
-58.33333333333337,
-2.5
],
"startBinding": {
"elementId": "sCavNl5y82xK5KX398rB2",
"focus": -0.89193538497504,
"gap": 3.4156973742469745
},
"endBinding": null,
"startArrowhead": null,
"endArrowhead": "arrow"
},
{
"id": "CB9KBAWnRv4-rNdZMC0rf",
"type": "arrow",
"x": -294.9176359590864,
"y": 301.3568992267717,
"width": 233.1543280973182,
"height": 118.33061493947932,
"angle": 0,
"strokeColor": "#2b8a3e",
"backgroundColor": "#868e96",
"fillStyle": "hachure",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"strokeSharpness": "round",
"seed": 887741881,
"version": 321,
"versionNonce": 1974115319,
"isDeleted": false,
"boundElements": null,
"updated": 1658730524153,
"link": null,
"points": [
[
0,
0
],
[
210.40756438050644,
82.05841639019172
],
[
233.1543280973182,
118.33061493947932
]
],
"lastCommittedPoint": [
68.33333333333337,
165.83333333333326
],
"startBinding": null,
"endBinding": {
"elementId": "WjZQr-0R9mZNO4Ci2hSiV",
"focus": 0.08857204751449008,
"gap": 15.736692138231803
},
"startArrowhead": null,
"endArrowhead": "arrow"
}
],
"appState": {
"theme": "light",
"viewBackgroundColor": "#ffffff",
"currentItemStrokeColor": "#2b8a3e",
"currentItemBackgroundColor": "#868e96",
"currentItemFillStyle": "hachure",
"currentItemStrokeWidth": 0.5,
"currentItemStrokeStyle": "solid",
"currentItemRoughness": 1,
"currentItemOpacity": 100,
"currentItemFontFamily": 1,
"currentItemFontSize": 16,
"currentItemTextAlign": "left",
"currentItemStrokeSharpness": "sharp",
"currentItemStartArrowhead": null,
"currentItemEndArrowhead": "arrow",
"currentItemLinearStrokeSharpness": "round",
"gridSize": null,
"colorPalette": {}
},
"files": {}
}

%%